Day 5:2785. 将字符串中的元音字母排序

49 阅读2分钟

Leetcode 2785. 将字符串中的元音字母排序

给你一个下标从 0 开始的字符串 s ,将 s 中的元素重新 排列 得到新的字符串 t ,它满足:

  • 所有辅音字母都在原来的位置上。更正式的,如果满足 0 <= i < s.length 的下标 i 处的 s[i] 是个辅音字母,那么 t[i] = s[i] 。
  • 元音字母都必须以他们的 ASCII 值按 非递减 顺序排列。更正式的,对于满足 0 <= i < j < s.length 的下标 i 和 j ,如果 s[i] 和 s[j] 都是元音字母,那么 t[i] 的 ASCII 值不能大于 t[j] 的 ASCII 值。

请你返回结果字母串。

元音字母为 'a' ,'e' ,'i' ,'o' 和 'u' ,它们可能是小写字母也可能是大写字母,辅音字母是除了这 5 个字母以外的所有字母。

image.png

两个 List,分别保存元音字母和元音字母的位置,而其中,原因字母是要排序的,而与元音字母的位置是不变的,将其排序后的位置,插入进入即可。
其中字符串是需要改变的,有两种解决办法:

  • 使用可变的字符串对象:StringBuffer 或 StringBuilder,再不考虑多线程的情况下使用 StringBuilder,因为 StringBuffer 是线程安全的,但 StringBuilder 是线程不安全的,但 StringBuilder 效率更高。
  • 使用字符数组进行处理 String.toCharArray()
class Solution {
    public String sortVowels(String s) {
        int n = s.length();
        List<Character> chars = new ArrayList<>(); // 元音字母
        List<Integer> indexes = new ArrayList<>(); // 元音字母的位置
        char[] ss = s.toCharArray();

        for (int i = 0; i < n; i++) {
            char c = s.charAt(i);
            if (isVowel(c)) {
                chars.add(c);
                indexes.add(i);
            }
        }

        Collections.sort(chars);

        n = indexes.size();
        for (int i = 0; i < n; i++) {
            ss[indexes.get(i)] = chars.get(i);
        }

       return String.valueOf(ss);
    }
    
    public boolean isVowel(char c) {
        if (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u'
        || c == 'A' || c == 'E' || c == 'I' || c == 'O' || c == 'U') {
            return true;
        }
        return false;
    }
}

后记:
对于可变字符串的处理:

  • 如果长度是确定的,可以考虑使用字符数组进行处理。
  • 如果长度可变,且支持多线程,则使用 StringBuffer 处理。
  • 如果长度可变,不需要支持多线程,则使用 StringBuildere 处理。