翻转字符串里的单词

约定不等于承诺〃 2023-02-17 12:26 122阅读 0赞

一、前言

问题来源LeetCode

问题链接:https://leetcode-cn.com/explore/interview/card/bytedance/242/string/1011/

二、题目

给定一个字符串,逐个翻转字符串中的每个单词。

示例 1:

  1. 输入: "the sky is blue"
  2. 输出: "blue is sky the"

示例 2:

  1. 输入: " hello world! "
  2. 输出: "world! hello"
  3. 解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。

示例 3:

  1. 输入: "a good example"
  2. 输出: "example good a"
  3. 解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。

说明:

  • 无空格字符构成一个单词。
  • 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
  • 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。

三、思路

逆序打印字符串,用栈实现简单直观,解法一的思路。可以在解法一的基础上优化,将字符串从后往前截取,然后将截取的字符串拼接在一起即可

四、编码实现

  1. //==========================================================================
  2. /**
  3. * @file : 05_ReverseWords.h
  4. * @title: 翻转字符串里的单词
  5. * @purpose : 给定一个字符串,逐个翻转字符串中的每个单词。
  6. *
  7. * 示例 1:
  8. * 输入: "the sky is blue"
  9. * 输出: "blue is sky the"
  10. *
  11. * 示例 2:
  12. * 输入: " hello world! "
  13. * 输出: "world! hello"
  14. * 解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
  15. *
  16. * 示例 3:
  17. * 输入: "a good example"
  18. * 输出: "example good a"
  19. * 解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
  20. * 说明:
  21. * 无空格字符构成一个单词。
  22. * 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
  23. * 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
  24. *
  25. * 来源:力扣(LeetCode)
  26. * 链接:https://leetcode-cn.com/explore/interview/card/bytedance/242/string/1011/
  27. * 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
  28. */
  29. //==========================================================================
  30. #pragma once
  31. #include <stack>
  32. #include <vector>
  33. #include <iostream>
  34. using namespace std;
  35. #define NAMESPACE_REVERSEWORDS namespace NAME_REVERSEWORDS {
  36. #define NAMESPACE_REVERSEWORDSEND }
  37. NAMESPACE_REVERSEWORDS
  38. // 方法一:用栈辅助解决
  39. class Solution_1
  40. {
  41. public:
  42. string reverseWords(string s)
  43. {
  44. if (s.empty())
  45. return s;
  46. stack<string> st;
  47. string str;
  48. for (int i = 0; i < s.length(); ++i)
  49. {
  50. if (s[i] == ' ')
  51. {
  52. if (!str.empty())
  53. {
  54. st.push(str);
  55. str.clear();
  56. }
  57. continue;
  58. }
  59. else
  60. {
  61. if (str.empty())
  62. str = s[i];
  63. else
  64. str += s[i];
  65. }
  66. }
  67. if (!str.empty())
  68. st.push(str);
  69. string result;
  70. while (!st.empty())
  71. {
  72. if (result.empty())
  73. result = st.top();
  74. else
  75. result = result + " " + st.top();
  76. st.pop();
  77. }
  78. return result;
  79. }
  80. };
  81. // 方法二:将字符串从后往前截取,然后将截取的字符串拼接在一起
  82. class Solution_2
  83. {
  84. public:
  85. string reverseWords(string s)
  86. {
  87. if (s.size() == 0)
  88. return s;
  89. string res = "";
  90. int i = (int)s.size() - 1;
  91. int len = 0;
  92. for (; i >= 0; i--)
  93. {
  94. if (len != 0 && s[i] == ' ')
  95. {
  96. res += s.substr(i + 1, len);
  97. res += ' ';
  98. len = 0;
  99. continue;
  100. }
  101. if (s[i] != ' ') len++;
  102. }
  103. if (len != 0) res += s.substr(0, len) + ' ';
  104. if (res.size() != 0) res.pop_back();
  105. return res;
  106. }
  107. };
  108. //
  109. // 测试 用例 START
  110. void test(const char* testName, string s, string& expect)
  111. {
  112. Solution_1 S1;
  113. Solution_2 S2;
  114. string result1 = S1.reverseWords(s);
  115. string result2 = S2.reverseWords(s);
  116. if (result1 == expect && result2 == expect)
  117. cout << testName << ", solution12 passed." << endl;
  118. else
  119. cout << testName << ", solution failed. result1:" << result1 << ", result2:" << result2 << " ,expect:" << expect << endl;
  120. }
  121. // 测试用例
  122. void Test1()
  123. {
  124. string s = "0";
  125. string expect = "0";
  126. test("Test1()", s, expect);
  127. }
  128. void Test2()
  129. {
  130. string s = "the sky is blue";
  131. string expect = "blue is sky the";
  132. test("Test2()", s, expect);
  133. }
  134. void Test3()
  135. {
  136. string s = " hello world! ";
  137. string expect = "world! hello";
  138. test("Test3()", s, expect);
  139. }
  140. void Test4()
  141. {
  142. string s = "a good example";
  143. string expect = "example good a";
  144. test("Test4()", s, expect);
  145. }
  146. NAMESPACE_REVERSEWORDSEND
  147. // 测试 用例 END
  148. //
  149. void ReverseWords_Test()
  150. {
  151. NAME_REVERSEWORDS::Test1();
  152. NAME_REVERSEWORDS::Test2();
  153. NAME_REVERSEWORDS::Test3();
  154. NAME_REVERSEWORDS::Test4();
  155. }

执行结果:

20200614085359868.png

发表评论

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

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

相关阅读