题解
字符串旋转
1 条题解
-
0
解题思路
旋转一次的意思,就是把字符串的最后一个字符搬到最前面。比如
abcdef旋转一次就变成fabcde。那旋转 k 次会是什么样子呢?我们可以把字符串想象成一个圆圈:每次旋转都相当于把整串往右“推”一格,转 k 次之后,原来最后面的 k 个字符全部跑到了最前面,剩下的字符按原顺序跟在后面。
所以公式就出来了:
旋转 k 次的结果 = 后 k 个字符 + 前 (长度-k) 个字符
举个例子:
hello,长度是 5,k=3。- 后 3 个字符是
llo; - 前面的字符剩下
he; - 拼接起来就是
llohe,和样例输出一致!
代码里用
substr来取字符串的一部分:s.substr(n-k):从第n-k位开始一直取到末尾,也就是后 k 个字符;s.substr(0, n-k):从第 0 位开始取前n-k个字符。
把两个部分加起来就是答案。如果 k 比长度还大,先用
k = k % n处理一下,转一圈等于没转,所以取余就行。参考代码
// P4550 字符串旋转:把最后k个字符移到最前面 #include <iostream> #include <string> using namespace std; int main() { string s; int k; cin >> s >> k; // 读入原字符串和旋转次数 int n = s.size(); // 字符串长度 k = k % n; // k可能大于n,取模保险 // 旋转k次 = 末尾k个字符搬到前面 string ans = s.substr(n - k) + s.substr(0, n - k); cout << ans << endl; return 0; }复杂度分析
- 取子串和拼接字符串,每个字符最多被复制两次,时间 O(n);
- 只需要一个答案字符串,空间 O(n)。
总时间复杂度 O(n),空间复杂度 O(n),其中 n 是字符串长度,n 很小,轻松通过。
- 后 3 个字符是
- 1