151.翻转字符串里的单词

古城微笑少年丶 2023-10-13 22:07 190阅读 0赞

151.翻转字符串里的单词

  • 题干背景
  • 重要思路
  • 具体代码

题干背景

力扣入口 - 151.翻转字符串里的单词

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

示例 1:
输入: “the sky is blue”
输出: “blue is sky the”

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

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

重要思路

  1. 答案解析是希望不使用辅助空间,空间复杂度要求为O(1)
  2. 解题思路:移除多余空格 -》将整个字符串反转 -》将每个单词反转。
  3. 移除多余空格,可以适用erase,但是时间复杂度是O(n),所以考虑使用双指针法,最后resize(重新设置)一下字符串的大小。

具体代码

  1. /**
  2. * 不适用Java内置方法实现
  3. * <p>
  4. * 1.去除首尾以及中间多余空格
  5. * 2.反转整个字符串
  6. * 3.反转各个单词
  7. * @param s
  8. * @return
  9. */
  10. // 151. 翻转字符串里的单词
  11. public String reverseWords(String s){
  12. // 1. 去除首尾以及中间多余空格
  13. StringBuilder builder = removeSpace(s);
  14. // 2. 反转整个字符串
  15. reverseString(builder, 0, builder.length() - 1);
  16. // 3. 反转各个单词
  17. reverseEachWords(builder);
  18. return builder.toString();
  19. }
  20. private StringBuilder removeSpace(String s){
  21. int start = 0;
  22. int end = s.length() - 1;
  23. while(s.charAt(start) == ' ') start++;
  24. while(s.charAt(end) == ' ') end--;
  25. StringBuilder builder = new StringBuilder();
  26. while(start <= end){
  27. char c = s.charAt(start);
  28. if(c != ' ' || builder.charAt(builder.length() - 1) != ' '){
  29. builder.append(c);
  30. }
  31. start++;
  32. }
  33. return builder;
  34. }
  35. /**
  36. * 反转字符串指定区间[start, end]的字符
  37. * @return
  38. */
  39. public void reverseString(StringBuilder sb, int start, int end){
  40. while(start < end){
  41. char temp = sb.charAt(start);
  42. sb.setCharAt(start, sb.charAt(end));
  43. sb.setCharAt(end, temp);
  44. start++;
  45. end--;
  46. }
  47. }
  48. private void reverseEachWords(StringBuilder sb){
  49. int start = 0;
  50. int end = 1;
  51. int n = sb.length();
  52. while(start < n){
  53. while(end < n && sb.charAt(end) != ' '){
  54. end++;
  55. }
  56. reverseString(sb, start, end - 1);
  57. start = end + 1;
  58. end = start + 1;
  59. }
  60. }

参考资料:151.翻转字符串里的单词

发表评论

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

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

相关阅读