字符串循环左移

题目:

给定一个字符串S[0...N-1],要求把S的前k个字符移动到S的尾部,如把字符串"abcdef"前面的2个字符'a','b'移动到字符串的尾部,得到新的字符串"cdefab":即字符串循环左移k位。

算法要求:时间复杂度O(N),空间复杂度为O(1)

*循环左移k位等价于循环右移N-k位

 

方法:

1. 暴力方法:整体左移k次

2. 一块一块移动,先申请新的空间存储前k个字符,然后直接左移后面N-k个字符,然后把前面k个字符接在末尾

*但这两种方法都不满足时间复杂度和空间复杂度的要求

3.三次翻转:先分别原地翻转前k个字符和后面N-k个字符,然后再整体翻转一次

 

#include <iostream>
#include <string>

using namespace std;

void ReverseString(string &s, int from, int to)
{
    char temp;
    while(from<to)  
    {
        temp=s[from];
        s[from++]=s[to];
        s[to--]=temp;
    }

}


int main()
{
    string s;
    int n;
    cout<<"请输入字符串和循环左移的位数:";
    cin>>s>>n;
    cout<<endl;

    ReverseString(s,0,n-1);
    ReverseString(s,n,s.size()-1);
    ReverseString(s,0,s.size()-1);

    cout<<s<<endl;

    return 0;
}

ReverseString()函数采用对称交换的方法来翻转字符串,如果翻转长度为k的字符串,则交换次数为k/2(向下取整)。

 

posted on 2016-04-23 15:53  summerkiki  阅读(3087)  评论(0编辑  收藏  举报