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