Leet code 151.反转字符串里的单词

题目描述

给定一句英文,要求倒叙输出每一个单词,并删除单词两边冗余的空格(句子前面和后面没有空格,两个单词之间没有空格)。
注意:不可以使用额外的辅助空间,即原地修改字符串。

思路讲解

  1. 先去除多余的空格
  2. 将整个字符串进行反转
  3. 将每个单词进行反转

代码描述

class Solution {
      //1.去除多余的空格
    public String removeExtraSpace(String s) {
        char[] chars = s.toCharArray();
        int fastIndex = 0;
        int slowIndex = 0;
        int length = chars.length;
        while (chars[fastIndex] == ' ') {
            fastIndex++;
        }
        slowIndex = fastIndex;
        while (fastIndex < length) {
            if ( fastIndex > 0 &&  chars[fastIndex-1] == chars[fastIndex] && chars[fastIndex] == ' ') {
                fastIndex++;
            } else {
                chars[slowIndex++] = chars[fastIndex++];
            }
        }
        return new String(chars,0,slowIndex);
    }

    //2.将整个句子进行反转
    public String reverseSequence(String s) {
        char[] chars = s.toCharArray();
        int length = chars.length;
        char temp;
        for (int i=0; i<length/2; ++i) {
            temp = chars[i];
            chars[i] = chars[length-i-1];
            chars[length-i-1] = temp;
        }
        return new String(chars,0,length);
    }

    // 3. 在一个字符区间内进行反转
    public String reverseAreaStr(String s,int start ,int end) {
        char[] chars = s.toCharArray();
        if (chars.length == 1) {
            return s;
        }
        if ( start >= end || start < 0 || end >= chars.length) {
            return s;
        }
        char temp;
        // end - start :要反转区间的长度
        for (int i = 0; i<=(end-start)/2; ++i) {
            temp = chars[start+i];
            chars[start+i] = chars[end-i];
            chars[end-i] = temp;
        }
        return new String(chars);
    }

    public static String reverseWords(String s){
        String s1 = removeExtraSpace(s);
        String s2 = reverseSequence(s1);
        String[] s3 = s2.split(" ");
        StringBuffer sb = new StringBuffer();
        for (String s4 : s3) {
            String s5 = reverseAreaStr(s4, 0, s4.length()-1);
            sb.append(s5);
            sb.append(" ");
        }
        return sb.toString().trim();
    }

}

总结

这道算法题主要学习了解题的思路,还是学习去除多余的空格算法,这个功能是从移除相同数字的算法演变而来。

posted @ 2022-11-17 21:05  wzpro  阅读(19)  评论(0)    收藏  举报