问题描述:
Given a string s, reverse only all the vowels in the string and return it.
The vowels are ‘a’, ‘e’, ‘i’, ‘o’, and ‘u’, and they can appear in both cases.
s consist of printable ASCII characters
将原字符串中的元音字母倒序
注意审题,A与a均为元音,所以要考虑大小写
思路:同样是双指针夹击,当左侧指针遇到元音字母时,停住并设立stopSign标记,否则前进;同理右侧指针。若在某一时刻两侧指针均被stopSign标记,这时需要交换,交换后解除stopSign,并继续靠近。
遇到的问题:没审清题,未考虑元音字母存在的大小写问题
代码如下:
注:用stringbuilder方便交换字符串中的元素
public String reverseVowels(String s) {
int left=0;
int right=s.length()-1;
char temp = ' ';
StringBuilder ans = new StringBuilder(s);
boolean stopSign_left = false;
boolean stopSign_right = false;
//when any pointer detects a vowel, stop, and do not move until the other pointer detects a vowel
while(left<right){
if (isVowel(ans.charAt(left))){
stopSign_left = true;
}
else{
left++;
}
if (isVowel(ans.charAt(right))){
stopSign_right = true;
}
else{
right--;
}
if ((stopSign_left)&&(stopSign_right)){
temp = ans.charAt(left);
ans.setCharAt(left, s.charAt(right));
ans.setCharAt(right, temp);
stopSign_left = false;
stopSign_right = false;
left++;
right--;
}
}
return ans.toString();
}
public boolean isVowel(char something){
if ((something=='a')||(something=='e')||(something=='i')||(something=='o')||(something=='u')||(something=='A')||(something=='E')||(something=='I')||(something=='O')||(something=='U')){
return true;
}
return false;
}
}
时间复杂度:O(n)