翻转字符串中的单词

落日映苍穹つ 2024-03-26 23:27 125阅读 0赞

题目:给你一个字符串 s ,请你反转字符串中 单词 的顺序。
单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。
返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。
注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。

解题思路:拆分

  1. 先去除字符串首尾,以及中间多余的空格
  2. 翻转整个字符串
  3. 翻转字符串中的每个单词

代码:

  1. class Solution {
  2. public String reverseWords(String s) {
  3. // 去除首尾及中间多余的空格
  4. StringBuilder sb = removeSpace(s);
  5. // 翻转整个字符串
  6. reverse(sb, 0, sb.length()-1);
  7. // 翻转每个单词
  8. reverseEachWord(sb);
  9. // 返回最终字符串
  10. return sb.toString();
  11. }
  12. // 去除首尾及中间多余的空格
  13. private StringBuilder removeSpace(String s){
  14. int start = 0, end = s.length()-1;
  15. while(s.charAt(start) == ' ') start++; // 去除头部空格
  16. while(s.charAt(end) == ' ') end--; // 去除尾部空格
  17. StringBuilder sb = new StringBuilder();
  18. while(start <= end){
  19. char ch = s.charAt(start);
  20. if(ch != ' ' || sb.charAt(sb.length()-1) != ' '){
  21. // 追加当前不是空格的字符,以及前一个不是空格的空格
  22. sb.append(ch);
  23. }
  24. start++;
  25. }
  26. return sb;
  27. }
  28. // 翻转字符串的指定子串
  29. private void reverse(StringBuilder sb, int start, int end){
  30. while(start < end){
  31. char ch = sb.charAt(start);
  32. sb.setCharAt(start, sb.charAt(end));
  33. sb.setCharAt(end, ch);
  34. start++;
  35. end--;
  36. }
  37. }
  38. // 翻转每个单词
  39. private void reverseEachWord(StringBuilder sb){
  40. int len = sb.length();
  41. int start = 0, end = 1;
  42. while(start < len){
  43. while(end < len && sb.charAt(end) != ' '){
  44. end++;
  45. }
  46. // 翻转单词
  47. reverse(sb, start, end-1);
  48. // 寻找下一个单词
  49. start = end + 1;
  50. end = start + 1;
  51. }
  52. }
  53. }

参考链接:

https://leetcode.cn/problems/reverse-words-in-a-string/discussion/comments/1037814

发表评论

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

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

相关阅读

    相关 翻转字符串单词

    [题目:给你一个字符串 s ,请你反转字符串中 单词 的顺序。 单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。 返回 单词 顺序颠