问题详情 我试图仅反转给定字符串中的元音并返回修改后的字符串。
元音为“a”、“e”、“i”、“o”和“u”,它们可以以小写和大写形式出现多次。
示例1:
输入:s =“hello”输出:“holle”
示例2:
输入:s = "leetcode" 输出:"leotcede"
限制:
1 <= s.length <= 3 * 105 s consist of printable ASCII characters.
我的方法
package test.test;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
public class ReverseVowel4 {
public static String reverseVowels(String s) {
Set<Character> set = new HashSet<>(Arrays.asList('a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U'));
char[] charArray = s.toCharArray();
int i = 0;
int j = s.length() - 1;
while (i < j) {
if (set.contains(charArray[i]) && set.contains(charArray[j])) {
char temp = charArray[i];
charArray[i] = charArray[j];
charArray[j] = temp;
i++;
j--;
} else if (set.contains(s.charAt(i)) && !set.contains(s.charAt(j))) {
j--;
} else if (!set.contains(s.charAt(i)) && set.contains(s.charAt(j))) {
i++;
} else {
i++;
j--;
}
}
return new String(charArray);
}
public static void main(String[] args) {
String ss = reverseVowels("aA");
System.out.println(ss);
}
}
问题
在给定的限制下,这是反转字符串中元音的最有效方法,还是有更好的方法?如果有任何优化或替代方法,我将不胜感激。
您可以使用 Java 8 流优化代码。
public static String reverseVowels(String input) {
Set<Character> vowelSet = new HashSet<>(Arrays.asList('a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U'));
// Collect vowels from the input string
List<Character> vowels = input.chars()
.mapToObj(c -> (char) c)
.filter(vowelSet::contains)
.collect(Collectors.toList());
List<Character> reversedVowels = new ArrayList<>(vowels);
Collections.reverse(reversedVowels);
// Replace vowels in the original string with reversed vowels
char[] result = input.toCharArray();
final int[] vowelIndex = {0};
IntStream.range(0, input.length())
.filter(i -> vowelSet.contains(result[i]))
.forEach(i -> result[i] = reversedVowels.get(vowelIndex[0]++));
return new String(result);
}