标签:
题目:
给定一个字符串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(向下取整)。
标签:
原文地址:http://www.cnblogs.com/summerkiki/p/5424818.html