给定一个字符串 s ,逐个翻转字符串中的所有单词 ,单词是由非空格字符组成的字符串,s 中使用至少一个空格将字符串中的单词分隔开,返回一个翻转 s 中单词顺序并用单个空格相连的字符串。
示例如下:
一、一般解法
思路如下:
- 遍历字符串,将每个单词存储在一个数组中。
- 对数组进行倒序输出。
每个单词可以用空格区分,但需要注意处理多个空格的情况,有较多的细节需要处理,具体实现代码如下:
//Solution1--普通解法
string reverseWords(string s) {
string result[1000] = {"&"};
s = s+' ';
int a = 0;
string s1 = "";
if (s[0] != ' ') s1 += s[0];
for (int i = 1; i<s.size(); i++) {
if (s[i] != ' ') {
s1 = s1 + s[i];
}
else if(s[i] == ' ' && s[i-1] != ' '){
result[a] = s1;
s1 = "";
a++;
}
}
string r = "";
for(int j = a-1; j>=0; j--) {
if(result[j] != "&") {
r += result[j];
if (j > 0) {
r = r+" ";
}
}
}
return r;
}
二、双指针法
使用双指针法进行反转步骤如下:
- 移除多余空格
- 将整个字符串进行反转
- 将每个单词进行反转
具体实现代码如下:
//Solution2--双指针法
//去掉多余空格
void removeExtraSpace(string& s) {
//删除中间的空格
for (int i = s.size()-1; i>0; i--) {
if(s[i] == s[i-1] && s[i] == ' ') {
s.erase(s.begin()+i);
}
}
//删除最后的空格
if(s.size()>0 && s[s.size()-1] == ' ') {
s.earse(s.begin() + s.size()-1);
}
//删除最前面的空格
if(size()>0 && s[0] = 0) {
s.erase(s.begin())
}
}
//反转字符串
void reverse(string& s, int start, int end) {
for(int i = start,j = end; i<j; i++,j--) {
swap(s[i], s[j]);
}
}
//单词反转
string reverseWords(string s) {
removeExtraSpace(s);
reverse(s, 0, s.size()-1);
int start = 0;
int end = 0;
bool entry = false; //标记枚举字符串过程中是否进入单词区间
for(int i = 0; i<s.size(); i++) {
if((!entry) || ((s[i] != ' ' && s[i-1] == ' '))) {
start = i;
entry = true;
}
//单词后面有空格,空格就是分隔符
if(entry && s[i] == ' ' && s[i-1] != ' ') {
end = i-1;
entry = false;
reverse(s,start,end);
}
//最后一个单词
if(entry && (i==(s.size()-1)) && s[i] != ' ') {
end = i;
entry = false;
reverse(s,start,end);
}
}
return s;
}