top1编程
← 返回题目
题解

字符串旋转

1 条题解

  • 0
    @ 2026-8-5 10:15:42

    解题思路

    旋转一次的意思,就是把字符串的最后一个字符搬到最前面。比如 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 很小,轻松通过。

    • 1