问题1:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. ",则输出"student. a am I"。
思路:翻转整个句子,然后翻转每个单词。
代码:
class Solution {
public:
string ReverseSentence(string str) {
if(str.empty())
return str;
reverse(str.begin(),str.end());
string::iterator iter1=str.begin();
string::iterator iter2=str.begin();
while(iter1!=str.end())
{
if(*iter1==' ')
{
iter1++;
iter2++;
}
else if(*iter2==' ')
{
// why not reverse(iter1,--iter2); Because range is [first,last).
reverse(iter1,iter2);
iter1=++iter2;
}
else if(iter2==str.end())
{
reverse(iter1,iter2);
break;
}
else
{
iter2++;
}
}
return str;
}
};
复杂度分析:时间复杂度为O(n),空间复杂度为O(1)。
问题2:字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。
思路:基于上述问题的解决方法(翻转字符串)
首先,将字符串分为两部分,然后,两部分分别进行翻转,最后,将整个字符串进行翻转。
复杂度分析:时间复杂度为O(n),空间复杂度为O(1)。