您的位置:首页 > 其它

【8】左旋转字符串

2014-05-25 17:21 204 查看
题目:字符串的左旋转指的是把字符串前面若干个字符转移到字符串的尾部。例如输入字符串"abcdefg"和2,左旋转的结果就是"cdefgab"

方案一:常规作法利用一个O(n)的辅助空间,在利用O(n)的时间枚举字符串把字符串重新存储到新的辅助空间中。

方案二:先把字符串分成两部分,例如题目中分成"ab"和"cdefg";对这两部分进行翻转得到字符串"bagfedc";对整个字符串进行翻转得到"cdefgab",这样就完成字符串的左旋转。时间复杂度O(n),不需要辅助空间,效率高

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;

//翻转单词
void ReverseWord(char *begin, char *end){
if(begin == NULL || end == NULL){
return;
}
//翻转
while(begin < end){
swap(*begin, *end);//交换两个位置的字符
++begin;
--end;
}
}

//左旋转字符串
char *LeftRotateString(char *string, int k){
if(string == NULL || k <= 0){
return string;
}
int len = (int)strlen(string);
char *begin = string;
char *end = string+len-1;
if(k > len){ //k不合法
return NULL;
}
//三次旋转
ReverseWord(begin, begin+k-1);
ReverseWord(begin+k, end);
ReverseWord(begin, end);
return string;
}

int main(){
//样例
char str[] = "abcdefg";
char *string = NULL;
string = LeftRotateString(str, 2);
cout<<string<<endl;
getchar();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: