题目:
“student. a am I”,正确的句子应该是“I am a student.”。
思路
只需要对每个单词做翻转,然后再整体做翻转就得到了正确的结果。
#include <iostream>
#include <string>
#include <vector>
using namespace std;
class Solution
{
public:
string reverseSentence(string &str)
{
if (str.size() <= 0)
{
return NULL;
}
str += " ";
int mark = 0;
//先对每个小子串翻转
for (int i = 0; i < str.size() + 1; i++)
{
if (str[i] == ' ')
{
reverseWord(str, mark, i - 1);
mark = i + 1;
}
}
//再对整个字符串翻转
str = str.substr(0, str.size() - 1); //string 没有 str -= " ";
reverseWord(str, 0, str.size() - 1);
return str;
}
private:
string reverseWord(string &str, int begin, int end)
{
while (begin < end)
{
swap(str[begin++], str[end--]);
}
return str;
}
};
int main()
{
Solution s;
string str = "student a am i";
cout << s.reverseSentence(str) << endl;
system("pause");
return 0;
}
上述的输出结果为 i am a student
下述的结果为 iamastudent 去掉了空格
#include <iostream>
#include <string>
#include <vector>
using namespace std;
class Solution
{
public:
vector<string> reverseSentence(string str)
{
if (str.size() <= 0)
return result;
//扩展字符串方便操作,以免后面 .find()会返回 -1
str += " ";
//以空格区分子串,子串反转后存入result
for (int i = 0; i < str.size(); i++)
{
int pos = str.find(" ", i);
result.push_back(str.substr(i, pos - i));
i = pos;
}
//将result翻转
int begin = 0, end = result.size() - 1;
while (begin < end)
swap(result[begin++], result[end--]);
return result;
}
private:
vector<string> result;
};
int main()
{
Solution s;
string str = "student a am i";
vector<string> result = s.reverseSentence(str);
for (int i = 0; i < result.size(); i++)
{
cout << result[i];
}
system("pause");
return 0;
}
补充:
1、一般会扩展字符串,在后面加一个“ ”,方便操作
2、string的一些操作
string str
str.find("#"); 从str第0个字符开始寻找,找到第一个后返回字符坐标
str.find( "#", position ); 从str第position个位置开始寻找,返回下标
str.rfind( "#", position); 返回最后一个#的下标
str.substr( start, count); 对于str, 从start位置开始截取count个子串。