1. 程式人生 > 其它 >Lc_151翻轉字串裡的單詞

Lc_151翻轉字串裡的單詞

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));
    }
}

不會,我可以學;落後,我可以追趕;跌倒,我可以站起來!