字符串循环左移
程序员文章站
2022-07-14 20:38:10
...
字符串循环左移
简介
给定一个字符串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;
}
上一篇: glm一些注意事项