字符串循環左移
簡介
給定一個字符串S[0…N-1],要求把S的前k個字符移動到S的尾部,如把字符串"abcdef"前面的兩個字符’a’,'b’移動到字符串的尾部,得到新字符串"cdefab:即字符串循環左移k。
循環左移k位等價於循環右移n-k位。
算法要求:
- 時間複雜度爲
- 空間複雜度爲
問題分析
暴力位移法
- 每次循環左移1位,調用k次即可
- 時間複雜度,時間複雜度爲
三次拷貝
- S[0…k] T[0…k]
- S[k+1…N-1] S[0…N-k-1]
- T[0…k] S[N-k…N-1]
- 時間複雜度,空間複雜度
原地逆置
-
- 如:abcdef
- 時間複雜度,空間複雜度
代碼實現
/**
* 字符數組原地逆置
* @param str
* @param left
* @param right
* @return
*/
private char[] reverseString(char[] str, int left, int right) {
while (left < right) {
char t = str[left];
str[left++] = str[right];
str[right--] = t;
}
return str;
}
/**
*
* @param str
* @param k 循環左移k位
* @param len 字符數組總長度
* @return
*/
public char[] leftRotateString(char[] str, int k, int len) {
//防止左移位數超過數組總長度
k %= len;
str = reverseString(str, 0, k-1);
str = reverseString(str, k, len-1);
str = reverseString(str, 0, len-1);
return str;
}