将字符串前面m个字符移到字符串的尾部
给定一个字符串,要求将字符串前面m个字符移到字符串的尾部。
例如,将字符串“absdef”的前3个字符移到字符串尾部,得结果“defabc”。
法1:长度位n的字符串,移动位,共需要m*n次操作,同时设置一个变量保存第一个字符。所以,时间复杂度位O(mn),空间复杂度为O(l);
#include<iostream>
using namespace std;
void LeftShiftOne(char *s, int n) {
//保存左边第一个字符;
char t = s[0];
for (int i = 1; i < n; i++) {
s[i - 1] = s[i];
}
s[n - 1] = t;
}
void LeftRotateString(char *s, int n, int m) {
while (m--) {
LeftShiftOne(s, n);
}
}
int main() {
char ch[] = "1234";
LeftRotateString1(ch, strlen(ch), 5);
cout << ch;
}
法2:”三步反转法”,时间复杂度O(n),空间复杂度O(l)。
void ReverseString(char* s, int from, int to) {
//将字符串的首尾交换
while (from < to) {
char t = s[from];
s[from++] = s[to];
s[to--] = t;
}
}
void LeftRotateString(char* s, int n, int m) {
//若要左移动大于n位,那么与%n是等价的
m %= n;
/*
*1.将字符串分为两部分;
*2.分别反转这两部分的字符串;
*3.最后,将上述步骤得到的结果整体反转。
*/
ReverseString(s, 0, m - 1);
ReverseString(s, m, n - 1);
ReverseString(s, 0, n - 1);
}
int main() {
char ch[] = "1234";
LeftRotateString(ch, strlen(ch), 5);
cout << ch;
}
本文深入探讨了两种不同的字符串旋转算法,一种是通过多次单字符左移实现,时间复杂度为O(mn),另一种是高效的“三步反转法”,时间复杂度降低到O(n)。文章提供了详细的代码实现,包括如何通过反转部分字符串来达到旋转效果。

被折叠的 条评论
为什么被折叠?



