颠倒字符串中的单词

232 阅读1分钟

151 颠倒字符串中的单词

解题思路:

①移除多余空格

② 将整个字符串反转

③将每个单词反转

class Solution {
    public String reverseWords(String s) {
        StringBuilder sb =removeSpace(s);
        //去除空格
        reverString(sb, 0, sb.length() - 1);
        //反转每个字符
        reverseEachWord(sb);
        //反转每个单词
        return sb.toString();
    }

    //移除空格
    private StringBuilder removeSpace(String s) {
        int start = 0;
        int end =s.length() - 1;
        //从字符串开始索引遍历,只要寻找到第一次不是空格的位置,记录该位置,目的为了去除字符串前缀空格
        while(s.charAt(start) == ' ') start++;
        //从字符串末尾索引遍历,只要寻找到第一次不是空格的位置,记录该位置,目的为了去除字符串后缀空格
        while(s.charAt(end) == ' ') end--;

        StringBuilder sb = new StringBuilder();
        //去除中间多余空格
        while(start <= end) {
            char c = s.charAt(start);
            //c不是空格,直接添加进sb,由于每个单词是有一个空格隔开,当遇见空格时,要观察sb中末尾索引处是否是空格,若是则不添加
            if (c != ' ' || sb.charAt(sb.length() - 1) != ' ') {
                sb.append(c);
            }
            start++;
        }
        return sb;
    }

    //反转字符串
    private void reverString(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 void reverseEachWord(StringBuilder sb) {
        int start = 0;
        int end = 1;
        int n = sb.length();
        while(start < n) {
            //当遇到空格时,则表明单词需要反转
            while(end < n && sb.charAt(end) != ' ') {
                end++;
            }
            reverString(sb, start, end - 1);
            //记录下一次慢指针位置
            start = end + 1;
            //记录下一次快指针位置
            end = start + 1;
        }
    }
}