如何使用 Java 反转字符串中的元音?

问题描述 投票:0回答:1

问题详情 我试图仅反转给定字符串中的元音并返回修改后的字符串。

元音为“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 arrays java-8
1个回答
0
投票

您可以使用 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);
 }
            
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.