Leetcode 反转字符中的元音字母

一颗蔬菜 2019-09-06 PM 40℃ 0条

原题链接

这道题的算法思想和反转字符串一样,依旧是双指针,不同的地方是需要反转的字母不一定是位置对称的。算法的关键是元音字母的双向搜索。

/*
  执行用时 :16 ms, 在所有 Java 提交中击败了52.35%的用户
  内存消耗 :41.7 MB, 在所有 Java 提交中击败了40.37%的用户
*/
class Solution {
    // 元音字母:a e i o u
    public String reverseVowels(String s) {
        HashSet<Character> set = new HashSet<>(Arrays.asList('a','e','i','o','u','A','E','I','O','U'));
        char[] str = s.toCharArray(); // 字符串转字符串数组
        int start = 0;
        int end = str.length - 1;
        while (start < end) {
            if (set.contains(str[start])) {
                    if (set.contains(str[end])) {
                        char tmp = str[start];
                        str[start++] = str[end];
                        str[end--] = tmp;
                    }else{
                        end--;
                    }
            }else{
                 start++;
            }
        }
        return String.valueOf(str); // 字符数组转字符串
    }
}

上面的解法,我认为是最普通的解法了,来看看大佬的写法吧!

/*
执行用时 :6 ms, 在所有 Java 提交中击败了96.26%的用户
内存消耗 : 40.5 MB, 在所有 Java 提交中击败了59.46%的用户*/
class Solution {
    public String reverseVowels(String s) {
        char[] ss = s.toCharArray(); 
        int start = 0;
        int end = ss.length - 1;
        while (start < end) {
            while (!isVowelChar(ss[start])&& start < end) {
                start++;
            }
            while (!isVowelChar(ss[end]) && start < end) {
                end--;
            }
            char temp = ss[start];
            ss[start++] = ss[end];
            ss[end--] = temp;
        }
        return new String(ss);
    }
        private boolean isVowelChar(char ch){
        return ch == 'a' || ch == 'e' || ch == 'i' || ch == 'o' || ch == 'u' || ch == 'A' || ch == 'E' || ch == 'I' || ch == 'O' || ch == 'U' ;
    }
}
标签: 算法

非特殊说明,本博所有文章均为博主原创。