Lc_151翻轉字串裡的單詞
阿新 • • 發佈:2021-07-13
不會,我可以學;落後,我可以追趕;跌倒,我可以站起來!package com.leetcode.leetcode.licm; import org.apache.logging.log4j.util.Strings; /** * @description: /** * * 151. 翻轉字串裡的單詞 * * 給你一個字串 s ,逐個翻轉字串中的所有 單詞 。 * * <p> * * 單詞 是由非空格字元組成的字串。s 中使用至少一個空格將字串中的 單詞 分隔開。 * * <p> * * 請你返回一個翻轉 s 中單詞順序並用單個空格相連的字串。 * * <p> * * 說明: * * <p> * * 輸入字串 s 可以在前面、後面或者單詞間包含多餘的空格。 * * 翻轉後單詞間應當僅用一個空格分隔。 * * 翻轉後的字串中不應包含額外的空格。 * * <p> * * <p> * * 示例 1: * * <p> * * 輸入:s = "the sky is blue" * * 輸出:"blue is sky the" * * 示例 2: * * <p> * * 輸入:s = " hello world " * * 輸出:"world hello" * * 解釋:輸入字串可以在前面或者後面包含多餘的空格,但是翻轉後的字元不能包括。 * * 示例 3: * * <p> * * 輸入:s = "a good example" * * 輸出:"example good a" * * 解釋:如果兩個單詞間有多餘的空格,將翻轉後單詞間的空格減少到只含一個。 * * 示例 4: * * <p> * * 輸入:s = " Bob Loves Alice " * * 輸出:"Alice Loves Bob" * * 示例 5: * * <p> * * 輸入:s = "Alice does not even like bob" * * 輸出:"bob like even not does Alice" * * <p> * * <p> * * 提示: * * <p> * * 1 <= s.length <= 104 * * s 包含英文大小寫字母、數字和空格 ' ' * * s 中 至少存在一個 單詞 * * <p> * * <p> * * 進階: * * <p> * * 請嘗試使用 O(1) 額外空間複雜度的原地解法。 * * * * @param s * * @return * @author:licm * @create:2021-07-13 09:22 **/ public class Lc_151翻轉字串裡的單詞 { /** * 雙指標思路,不適用額外的空間 * <p> * 第一步 去除首尾空格 * 第二步 反轉所有字串 * 第三步 反轉沒一個字串 * * @param s * @return */ public static String reverseWords(String s) { StringBuilder sb = removeSpace(s); reverseString(sb, 0, sb.length() - 1); reverseEachWord(sb); return sb.toString(); } /** * 第一步 利用雙指標去除首尾空格 */ private static StringBuilder removeSpace(String s) { StringBuilder sb = new StringBuilder(); int left = 0; int right = s.length() - 1; while (s.charAt(left) == ' ') { left++; } while (s.charAt(right) == ' ') { right--; } while (left <= right) { if (s.charAt(left) != ' ' || sb.charAt(sb.length() - 1) != ' ') { sb.append(s.charAt(left)); } left++; } return sb; } private static void reverseString(StringBuilder sb, int start, int end) { while (start < end) { char temp = sb.charAt(start); sb.setCharAt(start, sb.charAt(end)); sb.setCharAt(end, temp); start++; end--; } } private static void reverseEachWord(StringBuilder sb) { int start = 0; int end = 1; int n = sb.length(); while (start < n) { while (end < n && sb.charAt(end) != ' ') { end++; } reverseString(sb, start, end - 1); start = end + 1; end = start + 1; } } public static void main(String[] args) { String s = " the sky is blue "; System.out.println(reverseWords(s)); } }