反转字符串中的字符串
题目描述
解决方法
- 栈
实现了字符串中元音字母的反转。首先创建了一个空的栈 st 用于存储元音字母,并创建一个包含所有可能元音字母的哈希集 hashset。然后,遍历字符串的字符数组,将所有元音字母压入栈中。接下来,再次遍历字符数组,如果是元音字母,就从栈中取出一个元音字母并添加到结果字符串中,从而实现了元音字母的反转操作。非元音字符保持原样。最终,返回反转后的字符串。
class Solution {
public String reverseVowels(String s) {
Stack<Character> st = new Stack<>();
Set<Character> hashset = new HashSet<>(Arrays.asList('a','e','i','o','u','A','E','I','O','U'));
char[] sc = s.toCharArray();
StringBuilder sb = new StringBuilder();
for(char ch: sc){
if(hashset.contains(ch)){
st.push(ch);
}
}
for(char ch: sc){
if(hashset.contains(ch)){
sb.append(st.pop());
}else{
sb.append(ch);
}
}
return sb.toString();
}
}
- 双指针
首先创建一个字符数组ch以及一个包含所有元音字母(包括大小写)的哈希集合hashset。然后,使用两个指针i和 j分别初始化为字符串的起始和末尾位置。
在一个循环中,逐步移动这两个指针,执行以下操作:
-
i 指针从左到右移动,直到指向一个元音字母或者 i 不再小于 j。
-
j 指针从右到左移动,直到指向一个元音字母或者 j不再大于 i。
-
一旦找到 i和j指向的元音字母,它们的位置被互换,即反转。然后,i指针向右移动, j指针向左移动,准备查找下一对需要交换的元音字母。
-
循环重复执行,直到 i不再小于 j,表示所有的元音字母已经被反转。
最终,算法返回一个新的字符串,其中所有的元音字母都被反转,而其他字符的顺序保持不变。
class Solution {
public String reverseVowels(String s) {
int i=0, j=s.length()-1;
char[] ch = s.toCharArray();
Set<Character> hashset = new HashSet<>(Arrays.asList('a','e','i','o','u','A','E','I','O','U'));
while(i<j&&i<s.length()&&j>-1){
while((!hashset.contains(ch[i])) && i<j){
i++;
}
while((!hashset.contains(ch[j])) && i<j){
j--;
}
char tmp = ch[i];
ch[i] = ch[j];
ch[j] = tmp;
i++;
j--;
}
return String.valueOf(ch);
}
}