题目:
2、给定一个字符串S[0…..N-1],要求把S的前k个字符移动到S的尾部,如把字符串”abcdef”前面的2个字符’a’,‘b’移动到字符串的尾部,得到新字符串”cdefab”:即字符串循环左移k。要求时间复杂度为O(N),空间复杂度为O(1)。
1)思路一:逐个字符左移,将bcdef依次左移1个,再将a移到末尾;b是同样的操作,这样最坏时间复杂度为O(N2)。
2)思路二:先将ab,cdef分别保存,再将ab拼接到cdef末尾,空间复杂度为O(N)。
3)思路三:
三次翻转: 令”ab” = X,”cdef” = Y;
①X翻转 -> X的逆序X’
②Y翻转 -> Y的逆序Y’
③X’Y’翻转 -> YX
类似的题目:
I LOVE U –> U LOVE I
I翻转,LOVE翻转,U翻转 ,最后整个翻转
代码:
/************************************
功能:翻转一句话中的词语,eg: i love u -> u love i
@athor:rly
@date: 2018-3-8
*************************************/
#include <string>
#include <iostream>
using namespace std;
void swap(char &c1, char &c2)
{
char tmp = c1;
c1 = c2;
c2 = tmp;
}
void reverseStr(string &str, int start, int end)
{
while (start < end)
{
swap(str[start], str[end]);
start++;
end--;
}
}
string rotateStrofWord(const string srcStr)
{
if (srcStr.size() <= 0)
{
return "";
}
string SrcStr = srcStr;
int start = 0;
int end = 0; //记录字符串中word在字符串中的起始位置和终止位置
for (start = 0; start < SrcStr.size();)
{
for (end = start; end < SrcStr.size();end++)
{
if (SrcStr[end] == ' ')
{
break;
}
} //当遇到空格时,说明已找到一个完整的词
if ((end - start) > 1)
{
reverseStr(SrcStr, start, end - 1);
} //当这个词个数大于1时才翻转
if (end == SrcStr.size())
{
break;
} //若找到了尾部,则结束
while (SrcStr[end] == ' ')
{
end++;
} //继续找下一个词
start = end;
}
reverseStr(SrcStr, 0, SrcStr.size() - 1); //最后整句翻转
return SrcStr;
}