本文解決經典字串旋轉問題:給定分隔符分隔的字串 "a|b|c|d",輸出所有循環位移組合。提供四種 VBScript 實作,從雙重迴圈、模運算優化、Join 整合到極簡單行版本,展示演算法思維演進。
輸入: "a|b|c|d"
輸出:
a|b|c|d
b|c|d|a
c|d|a|b
d|a|b|c
str = "a|b|c|d"
Call Sort(str, "|")
Function Sort(sSource, sDelimiter)
Dim I, J, N, sItems, sTemp
sItems = Split(sSource, sDelimiter)
For I = 0 To UBound(sItems)
For J = 0 To UBound(sItems)
N = I + J
If N > UBound(sItems) Then
N = N - UBound(sItems) - 1
End If
sTemp = sTemp & sItems(N) & sDelimiter
Next
sTemp = Left(sTemp, Len(sTemp) - Len(sDelimiter))
Wscript.Echo sTemp
sTemp = ""
Next
End Function
str = "a|b|c|d"
WSH.Echo Join(Sort(str, "|"), vbCrLf)
Function Sort(ByVal s, ByVal d)
Dim a, r(), i, j, h, index
a = Split(s, d)
h = UBound(a)
ReDim Preserve r(h)
index = Len(d) + 1
For i = 0 To h
r(i) = ""
For j = i To h + i
r(i) = r(i) & d & a(j Mod (h + 1))
Next
r(i) = Mid(r(i), index) ' 移除前導分隔符
Next
Sort = r
End Function
str = "a|b|c|d"
Wscript.Echo Sort(str, "|")
Function Sort(sSource, sDelimiter)
Dim I, J, N, sItems, sTemp
sItems = Split(sSource, sDelimiter)
N = UBound(sItems)
For I = 0 To N
For J = 0 To N
sTemp = sTemp & sItems((I + J) Mod (N + 1)) & sDelimiter
Next
sTemp = Left(sTemp, Len(sTemp) - Len(sDelimiter))
Sort = Sort & sTemp & vbCrLf
sTemp = ""
Next
Sort = Left(Sort, Len(Sort) - 1) ' 移除末尾換行
End Function
str = "a|b|c|d"
msgbox Sort(str, "|")
Function sort(ss, sd)
Dim n, i
For i = 0 To UBound(Split(ss, sd))
sort = sort + Mid(ss + sd + ss, n + 1, Len(ss)) + vbCrLf
n = InStr(n + 1, ss + sd + ss, sd)
Next
End Function
| 實作 | 核心技巧 | 時間複雜度 | 空間複雜度 |
|---|---|---|---|
| 雙重迴圈 + 邊界檢查 | If N > UBound Then N = N - UBound - 1 手動循環 | O(n²) | O(n) 輸出緩衝 |
模運算 Mod (n+1) | 數學循環索引,無需分支 | O(n²) | O(n²) 陣列儲存 |
字串拼接 (I+J) Mod (N+1) | 單一迴圈變數,直接輸出 | O(n²) | O(n²) 字串累加 |
| InStr 尋找分隔符 | ss+sd+ss 雙倍字串中找下一分隔符位置 | O(n²) | O(n²) 字串累加 |
// Java 版
public static List rotate(String input, String delimiter) {
String[] items = input.split(Pattern.quote(delimiter));
List result = new ArrayList<>();
for (int i = 0; i < items.length; i++) {
StringBuilder sb = new StringBuilder();
for (int j = 0; j < items.length; j++) {
if (j > 0) sb.append(delimiter);
sb.append(items[(i + j) % items.length]);
}
result.add(sb.toString());
}
return result;
}
// Python 版
def rotate(input_str, delimiter):
items = input_str.split(delimiter)
return [delimiter.join(items[i:] + items[:i]) for i in range(len(items))]
(i + j) % n 完美替代手動邊界檢查ss + sd + ss 使循環結構線性化,配合 InStr/indexOf 尋找分隔符"::")原文標題錯誤提示:原標題為「java應用回溯法求解數獨示例」,但實際內容為 VBScript 字串循環位移演算法。本文已依實際內容重寫。