字符串循環左移


題目:

給定一個字符串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(向下取整)。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM