leetcode 151 翻转字符串里的单词

川长思鸟来 2022-09-10 04:25 262阅读 0赞

前言

题目:151. 翻转字符串里的单词

参考题解:翻转字符串里的单词-力扣官方题解


提交代码

使用栈翻转

使用空格作为分隔符,提取语句中的单词放入栈中。将栈中的单词弹出,连接成语句。从而翻转语句。

  1. class Solution {
  2. public:
  3. string reverseWords(string s) {
  4. istringstream ss(s);
  5. stack<string> st;
  6. string result;
  7. // 当一句话中的单词全部压栈
  8. string word;
  9. while(ss>>word){
  10. st.push(word);
  11. st.push(" "); // 压入一个空格
  12. }
  13. st.pop();
  14. // 弹栈到result中
  15. while(!st.empty()){
  16. result+=st.top();
  17. st.pop();
  18. }
  19. return result;
  20. }
  21. };

原空间翻转

除非脑力过剩,要不然不会使用这种方法。不使用附加空间进行翻转,我参看了答案的思路之后,也进行了代码实现。

思路:移除多余空格-将整个字符串反转-将每个单词反转。

  1. class Solution {
  2. public:
  3. string deleteExtraSpaces(string s){
  4. // 使用快慢指针删除字符串中的多余空格:[i,j)范围的内容为多余内容
  5. if(s.empty())
  6. return s;
  7. const int len = s.size();
  8. int i=0,j=0;
  9. while(j<len){
  10. if((s[j]!=' ') || (j-1>=0 && s[j-1]!=' ')) // 合法需要保留的字符("word "):本身不是空格 || 作为分隔符的空格(本身是空格 && 前一个不是空格)
  11. s[i++] = s[j++];
  12. else{
  13. j++;
  14. }
  15. }
  16. if(s[i-1]==' ') // 上面过滤出的是(word )*格式。过滤,最后一个可能是空格,单独处理一下
  17. i--;
  18. assert(s[0]!=' ' || s[len-1]!=' ');
  19. if(i!=len)
  20. s.resize(i);
  21. return s;
  22. }
  23. // string reverseWord(string s, int start, int end){ //[start,end]闭区间翻转
  24. // reverse(s.begin()+start,s.begin()+end+1);
  25. // }
  26. string reverseWords(string s) {
  27. if(s.empty())
  28. return s;
  29. s = deleteExtraSpaces(s); // 删除多余空格
  30. reverse(s.begin(),s.end()); // 字符串翻转
  31. // 翻转单词,[i,j]闭合范围内为一单词
  32. int i=0,j=0;
  33. s.push_back(' '); // 统一格式为(word )
  34. const int len = s.size();
  35. while(i<len && j<len){
  36. while(s[j]!=' ') j++;
  37. reverse(s.begin()+i,s.begin()+j);
  38. i = j+1;
  39. j++;
  40. }
  41. s.pop_back(); // 删除最后一个空格
  42. return s;
  43. }
  44. };

附录

关于删除字符串之前/之后的空格,我这里保存了一份挺好看的代码。

  1. // trim from start (construct new string)
  2. inline std::string ltrim(const std::string &str){
  3. std::string s(str);
  4. s.erase(s.begin(), std::find_if_not<decltype(s.begin()), int(int)>(s.begin(), s.end(),
  5. std::isspace));
  6. return s;
  7. }
  8. // trim from end (construct new string)
  9. inline std::string rtrim(const std::string &str){
  10. std::string s(str);
  11. s.erase(std::find_if_not<decltype(s.rbegin()), int(int)>(s.rbegin(), s.rend(),
  12. std::isspace).base(), s.end());
  13. return s;
  14. }

发表评论

表情:
评论列表 (有 0 条评论,262人围观)

还没有评论,来说两句吧...

相关阅读