问题描述:
给定字符串和左旋的字符数,写程序实现字符串的左旋操作。例如对于字符串”12345678″, 左旋转4个字符后,变成”56781234″。要求时间复杂度为O(n),空间复杂度O(1)。
分析:
假设字符串表示为XY,X表示需要左旋的部分,左旋后字符串表示为YX。
根据公式:
代码实现:
// 26.cc
#include <iostream>
#include <string>
#include <cstring>
using namespace std; // 反转字符串
void reverse_str(char* start, char* end) {
if (!start || !end)
return;
while (start < end) {
swap(*start, *end);
start++;
end--;
}
} // 左移k个字符
void left_rotate_str(char*& str, size_t k) {
if (!str || k <= )
return; size_t n = strlen(str);
k = k % n; reverse_str(str, str + k - );
reverse_str(str + k, str + n - );
reverse_str(str, str + n - );
} int main() {
cout << "input a str:" << endl; string s;
getline(cin, s); char* str = new char[s.size() + ];
strcpy(str, s.c_str());
int k = < s.size() ? : ;
left_rotate_str(str, k); cout << "after left rotate " << k << " chars:" << endl << str << endl;
return ;
}
输出:
$ ./a.exe
input a str: after left rotate chars: