b759 - 我明明就有說過= =
題目描述
題目要求讀取一個字串 X,然後輸出 X 的所有循環位移。循環位移是指將字串的某個部分移動到字串的開頭,形成新的字串。例如,對於字串 "abcde",其循環位移包括 "abcde", "bcdea", "cdeab", "deabc", "eabcd"。
解題思路
程式碼使用巢狀迴圈來產生所有可能的循環位移。外層迴圈 i 決定了起始位置,內層迴圈 j 則迭代字串的每個字元,並根據起始位置 i 進行輸出。由於需要處理循環的情況,程式碼使用 j < a.length() 和 j >= a.length() 兩個條件來判斷字元的索引是否超出字串的範圍。如果超出範圍,則使用 j - a.length() 來計算實際的索引。
複雜度分析
- 時間複雜度: O(n^2),其中 n 是字串的長度。外層迴圈迭代 n 次,內層迴圈也迭代 n 次。
- 空間複雜度: O(1),程式碼只使用了常數級別的額外空間。
程式碼
#include <iostream>
#include <string>
using namespace std;
int main(){
string a;//abcde l5
while(cin >> a){
for(int i=0;i<a.length();i++){
for(int j=i;j<a.length()+i;j++){
if(j<a.length()){// a[0]=a
cout << a[j];
}
if(j>=a.length()){
cout << a[j-a.length()];
}
}
cout << endl;
}
}
}