1. 程式人生 > 其它 >78.反轉字串中的母音字母

78.反轉字串中的母音字母

給你一個字串 s ,僅反轉字串中的所有母音字母,並返回結果字串。

母音字母包括 'a''e''i''o''u',且可能以大小寫兩種形式出現。

/*
雙指標
一個樸素的做法是利用「雙指標」進行前後掃描,當左右指標都是母音字母時,進行互換並移到下一位。

由於母音字母相對固定,因此我們可以使用容器將其儲存,並使用 static 修飾,確保整個容器的建立和母音字母的填入在所有測試樣例中只會發生一次。

我們期望該容器能在 O(1)O(1) 的複雜度內判斷是否為母音字母,可以使用語言自帶的雜湊類容器(P2P2 程式碼)或是使用陣列模擬(P1P1 程式碼)。

一些細節:由於題目沒有說字串中只包含字母,因此在使用陣列模擬雜湊表時,我們需要用當前字元減去 ASCII 碼的最小值(空字元),而不是 'A'

*/

class Solution {
    static boolean[] hash = new boolean[128];
    static char[] vowels = new char[]{'a','e','i','o','u'};
    static {
        for (char c : vowels) {
            hash[c - ' '] = hash[Character.toUpperCase(c) - ' '] = true;
        }
    }
    public String reverseVowels(String s) {
        char[] cs = s.toCharArray();
        int n = s.length();
        int l = 0, r = n - 1;
        while (l < r) {
            if (hash[cs[l] - ' '] && hash[cs[r] - ' ']) {
                swap(cs, l++, r--);
            } else {
                if (!hash[cs[l] - ' ']) l++;
                if (!hash[cs[r] - ' ']) r--;
            }
        }
        return String.valueOf(cs);
    }
    void swap(char[] cs, int l, int r) {
        char c = cs[l];
        cs[l] = cs[r];
        cs[r] = c;
    }
}