我试图反转一个字符串的元音。我的程序可以运行,但是速度很慢,并且在大型String上超时。我怎样才能使其更快?编写一个将字符串作为输入并仅反转字符串的元音的函数。
示例1:给出s = "hello"
,return "holle"
。
示例2:给出s = "leetcode"
,return "leotcede"
。
注意:元音不包含字母“ y”。
public class Solution {
public String reverseVowels(String s){
Set<Character> vowel = new HashSet<>();
char [] sArray = s.toCharArray();
vowel.add('a');
vowel.add('e');
vowel.add('o');
vowel.add('i');
vowel.add('u');
vowel.add('A');
vowel.add('E');
vowel.add('I');
vowel.add('O');
vowel.add('U');
Stack<Character> v = new Stack<>();
String temp = "";
int i = 0;
for (Character c: sArray){
if (vowel.contains(c)){
v.push(c);
}
i++;
}
for (Character c: sArray){
if (vowel.contains(c)){
if (!v.empty())
c = v.pop();
}
temp+= c;
}
return temp;
}
}
编辑:我已经更改了使用StringBuilder的代码,现在它可以通过测试用例,但它仍然比95%的Java解决方案慢,因此,我将进行其他更改以尝试使其更快。我的程序运行缓慢并非完全是由于未使用StringBuilder。即使进行了更改,我的程序仍然非常慢。这不是其他问题的重复。
这里发生了一些事情:
的Set
元音的是被重新创建的每一个使用该方法的时间,和元音同样被添加到它的每一个的时间(它也可能涉及扩大集的大小); 因为它们不会改变,所以这不是必需的。(这并没有太大的区别,但我想我会提到它。)
在您的两个循环中以及将它们添加到元音中时,每个char
原语都Character
不必要地自动装箱到一个对象中Stack
。
正如汤姆(Tom)所链接的可能重复的建议那样,您可能会获得StringBuilder.append(char)
比+
运营商更好的性能。
我想尽办法,避免上述缺陷的更好的实现可能看起来像:
private static boolean isVowel(char c) {
switch (c) {
case 'a':
case 'e':
case 'i':
case 'o':
case 'u':
case 'A':
case 'E':
case 'I':
case 'O':
case 'U':
return true;
default: return false;
}
}
public static String reverseVowels(String s) {
final char [] sArray = s.toCharArray();
final StringBuilder reversedString = new StringBuilder();
final StringBuilder vowels = new StringBuilder();
int vowelIndex = -1;
for (char c : sArray) {
if (isVowel(c)) {
vowels.append(c);
++vowelIndex;
}
}
for (char c : sArray) {
if (isVowel(c))
c = vowels.charAt(vowelIndex--);
reversedString.append(c);
}
return reversedString.toString();
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句