算法day25 右旋字符串
题目描述

思路:双指针
对于符合题目要求的目标字符串,我们可以拥有一种这样的想法。首先,我们想要使倒数k位前置并且正向的顺序不改变,那么我们可以先整体反转,以abcdefg为例,即可得到gfedcba,此时k值要求为2,那么也即要使当前逆转过的倒序序列的前k项反转回来,即0至k-1反转,随后在将之后的k至序列末的区间再次反转,即可符合右旋字符串。要注意对于左右指针的更新的值,保证正确的设置指针。
代码如下:
#include <iostream>
int main() {
int k;
std::string s;
std::cin >> k;
std::cin >> s;
int left = 0;
int right = s.size() - 1;
char temp;
while (left < right) {
temp = s[left];
s[left] = s[right];
s[right] = temp;
right--;
left++;
}
left = 0;
right = k - 1;
while (left < right) {
temp = s[left];
s[left] = s[right];
s[right] = temp;
right--;
left++;
}
left = k;
right = s.size() - 1;
while (left < right) {
temp = s[left];
s[left] = s[right];
s[right] = temp;
right--;
left++;
}
std::cout << s;
return 0;
}
时间复杂度:O(n)
空间复杂度:O(1)
END
浙公网安备 33010602011771号