关闭

leetcode: Reverse Vowels of a String

标签: reversevowelstack
159人阅读 评论(0) 收藏 举报
分类:

345. Reverse Vowels of a String

 My Submissions
Total Accepted: 17907 Total Submissions: 50778 Difficulty: Easy

Write a function that takes a string as input and reverse only the vowels of a string.

Example 1:
Given s = "hello", return "holle".

Example 2:

Given s = "leetcode", return "leotcede".

关键:创建两个方向的指针,进行从左到右和从右到左的一次查询,并将元音进行调换。

方法一:

public class Solution {
    public String reverseVowels(String s) {
        String vowel = "aeiouAEIOU";
        char[] chars = s.toCharArray();
        int start = 0;
        int end = chars.length-1;
        while(start < end) {
            //寻找第一个为元音字母的char
            while(!(vowel.contains(chars[start]+""))){
                start++;}
            while(!(vowel.contains(chars[end]+""))){
                end--;}
            char temp = chars[start];
            chars[start] = chars[end];
            chars[end] = temp;
            start++;
            end--;
        }
        return new String(chars);
    }
}
java.lang.String.contains() 方法返回true,当且仅当此字符串包含指定的char值序列。
CharSequence与String都能用于定义字符串,但CharSequence的值是可读可写序列,
而String的值是只读序列,所以这里通过char加上一个空字符串将char数据类型转化成
CharSequence/String数据类型。

方法二:

public class Solution {
    public String reverseVowels(String s) {
        /*方法一:
        String vowel = "aeiouAEIOU";
        char[] chars = s.toCharArray();
        int start = 0;
        int end = chars.length-1;
        while(start < end) {
            //寻找第一个为元音字母的char
            while(!(vowel.contains(chars[start]+""))){
                start++;}
            while(!(vowel.contains(chars[end]+""))){
                end--;}
            char temp = chars[start];
            chars[start] = chars[end];
            chars[end] = temp;
            start++;
            end--;
        }
        return new String(chars);*/
        //方法2:通过stack的push和pop方法
        HashSet<Character> vowels = new HashSet<Character>();
        vowels.add('a');
        vowels.add('e');
        vowels.add('i');
        vowels.add('o');
        vowels.add('u');
        vowels.add('A');
        vowels.add('E');
        vowels.add('I');
        vowels.add('O');
        vowels.add('U');
        
        Stack<Character> stack = new Stack<Character>();
        char[] chars = s.toCharArray();
        for(char c:chars) {
            if(vowels.contains(c)) {
                stack.push(c);
            }
        }
        
        String string = new String();
        for(char c:chars) {
            if(vowels.contains(c)) {
                string += stack.pop();
            } else {
                string += c;
            }
            

        }
        return string;
        
    }
}
这里通过stack的push和pop来进行元音的顺序调换,很聪明的方法。

另外,注意一点很重要的部分:

 慎用ArrayList的contains方法,使用HashSet的contains方法代替

(http://blog.csdn.net/fenglibing/article/details/9021201)

发现ArrayList的contains方法的源码,发现其最终会调用他本身的indexOf方法;

而HashSet的contains方法使用的是Hashtable,所以速度回快很多。




0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:3701次
    • 积分:263
    • 等级:
    • 排名:千里之外
    • 原创:24篇
    • 转载:4篇
    • 译文:0篇
    • 评论:0条
    文章分类