字串的左旋右旋其實是乙個問題,下面只對右旋進行分析。
當乙個字串進行旋轉的時候,字串的大小會決定有效旋轉次數。這裡面的有效是指,後面的旋轉會與前面的旋轉相同,所以我們必須要對旋轉次數進行去重。
如「aabb」如何去重呢?一次右旋:baab
二次右旋:bbaa
三次右旋:abba
四次右旋:aabb
五次右旋:baab 這裡就和第一次右旋一樣了,所以我們必須進行去重操作
用旋轉的次數模上字串長度即可。
即count(次數) %= len(長度)
。
下面介紹幾種實現右旋的方法:
1.常規思路:字串右旋,這時字串會向右移動,此時我們先儲存,字串的最後乙個字元,將後乙個字元挨個等於前乙個字元,再將第乙個字元等於儲存的最後乙個字元。
**:
#include #include #include void rightrotate(char *arr,int len,int count);
int main()
void rightrotate(char *arr, int len, int count)
arr[i] = temp;//第乙個字元等於儲存的最後乙個字元
count--;
}}
2.字串逆置:
如這樣乙個字串,進行右旋3次。先進行兩次區域性逆置,分別從[0,len-count-1]
和[len-count,len-1]
。最後對字串進行整體逆置。
**:
#include #include #include void rightrotate(char *arr,int len,int count);
void reverse(char *arr, int start, int end);
int main()
void rightrotate(char *arr, int len, int count)
void reverse(char *arr, int start, int end)
strcpy(double_string, arr);//copy函式
strcat(double_string, arr);//字串連線
assign(arr, double_string, len, count);//將str2中合適的旋轉次數,賦予str1
printf("%s", arr);
return 0;
}void assign(char *arr, char *double_string, int len, int count)
}
上述,進行字串的右旋三種方法,第一種方法一般比較容易想到。
左旋問題也都可以用上述三種方法
字串左旋右旋問題
如把字串abcdef 左旋轉2 位得到字串cdefab。要求時間對長度為n 的字串操作的複雜度為o n 輔助記憶體為o 1 分析 如果不考慮時間和空間複雜度的限制,最簡單的方法莫過於把這道題看成是把字串分成前後兩部分,通過旋轉操作把這兩個部分交換位置。於是我們可以新開闢一塊長度為n 1 的輔助空間,...
左旋右旋字串
定義字串的左旋轉操作 把字串前面的若干個字元移動到字串的尾部。如把字串abcdef 左旋轉2 位得到字串cdefab。請實現字串左旋轉的函式。要求時間對長度為n 的字串操作的複雜度為o n 輔助記憶體為o 1 分析 如果不考慮時間和空間複雜度的限制,最簡單的方法莫過於把這道題看成是把字串分成前後兩部...
劍指offer之字串左旋右旋問題
右旋 關於思路 1.右旋就是把字串的前幾個字元放到字串的後面,首先,可以根據要旋轉的數量,把字串分成兩部分。2.第一部分進行翻轉,第二部分進行翻轉。3.整體翻轉 例如 abcdefgh 若要翻轉前兩個,首先把字串分為 ab cdefgh 然後 翻轉ba hgfedc 最後整體翻轉得到cdefghab...