翻转字符串里的单词
给定一个字符串,逐个翻转字符串中的每个单词。
示例 1:
输入: "the sky is blue
" 输出: "blue is sky the
"
示例 2:
输入: " hello world! "
输出: "world! hello"
解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
示例 3:
输入: "a good example"
输出: "example good a"
解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
说明:
- 无空格字符构成一个单词。
- 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
- 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
进阶:
请选用 C 语言的用户尝试使用 O(1) 额外空间复杂度的原地解法。
思路
先去除头部和尾部的字符串;再去除中间的字符串;再将所有的字符串进行反转;再以空格为界限,对每一个单词进行反转。
答案
class Solution {
public:
string reverseWords(string s) {
// // // Stack<string> stack=new Stack<>();//创建一个栈
// // Stack<string> stack = new Stack<>();
// // StringBuilder temp=new StringBuilder();
// // s+=" ";
// // for(int i=0;i<s.length();i++)
// // {
// // if(s.charAt(i)==" ")
// // {
// // if(temp.length()!=0)
// // {
// // stack.push(temp.toString());
// // temp = new stringBuilder();
// // }
// // }
// // else//不出现" "
// // temp.appdend(s.charAt(i))
// // }
// // if(stack.isEmpty())
// // {
// // return "";
// // }
// // StringBuilder res = new StringBuilder();
// // res.append(stack.pop());
// // while(!stack.isEmpty())
// // {
// // res.append(" ");
// // res.append(stack.pop());
// // }
// // return res.toString();
// // }
// string reverseWords(string s) {
// Stack<string> stack1 = new Stack<>();
// StringBuilder temp = new StringBuilder();
// s += " ";
// for (int i = 0; i < s.length(); i++) {
// if (s.charAt(i) == ' ') {
// if (temp.length() != 0) {
// stack.push(temp.toString());
// temp = new StringBuilder();
// }
// } else {
// temp.append(s.charAt(i));
// }
// }
// if (stack.isEmpty()) {
// return "";
// }
// StringBuilder res = new StringBuilder();
// res.append(stack.pop());
// while (!stack.isEmpty()) {
// res.append(" ");
// res.append(stack.pop());
// }
// return res.toString();
//去掉字符串前后的空格
int i1=0;//从前往后
int i2=s.size()-1;//从后往前
while(i1<s.size())
{
if(s[i1]!=' ')
break;
i1++;
}
while(i2>=0)
{
if(s[i2]!=' ')
{
break;
}
i2--;
}
s=s.substr(i1,i2-i1+1);
//去除中间多余的空格
int i3 = 1;
while(i3<s.size())
{
if(s[i3]==' ' && s[i3-1]==' ')
s.erase(i3-1,1);//当出现连着的空格时,删除前一个空格后,因为后面的空格会补上来,如果指针移动,会漏判一个空格。所以指针是不进行移动的。
else
i3++;
}
//将字符串全部反转
reverse(s.begin(),s.end());
s=s+' ';//给最后加一个空格,下面就可以根据空格进行反转了
int start=0;
int end=0;
while(end<=s.size()-1)
{
if(s[end]==' ')
{
reverse(s.begin()+start,s.begin()+end);
start=end+1;//每进行一次反转就更新一次end指针
}
end++;
}
s.pop_back();//将最后一位的空格删除
return s;
}
};
参考
https://blog.csdn.net/fuqiuai/article/details/83589770