Leetcode No.345反转字符串中的元音字母 双指针

题目大意

编写一个函数,以字符串作为输入,反转该字符串中的元音字母。
示例1

输入: "hello"
输出: "holle"

方法一:双指针

反转类题目考虑用双指针方法,设置两个指针i,j,分别从字符串的头和尾寻找第一个元音,当i和j都是元音,交换位置。

private boolean isVowel(char ch) {
        if(ch=='a'|| ch=='e' || ch=='i' || ch=='o' || ch=='u' ||
                ch=='A' || ch=='E' || ch=='I' || ch=='O' || ch=='U')
        return true;
        return false;
    }
public String reverseVowels(String s) {
        char[] arr = s.toCharArray();
        int i = 0, j = arr.length-1;
        while(i<j) {
            while(!isVowel(arr[i]) && i<j) ++i;
            while(!isVowel(arr[j]) && j>i) --j;
            char temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
            ++i;
            --j;
       }
       return new String(arr);
    }

运行时间5ms,击败99.08%。

方法二:栈

这个方法需要遍历两次字符串,第一次将所有的元音字母依次入栈,第二次每当遍历到一个元音,就将栈中的元素出栈,然后做替换操作。

public String reverseVowels(String s) {
        char[] arr = s.toCharArray();
        Stack<Character> stack = new Stack<>();
        for(char ch:arr) {  //将元音加入栈中
            if(isVowel(ch)) stack.push(ch);
        }
        for(int i=0;i<arr.length;i++) {
            if(isVowel(arr[i])) arr[i] = stack.pop(); 
        }
        return new String(arr); 
    }

运行时间12ms,击败64.97%。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容