给你一个字符串 s
,仅反转字符串中的所有元音字母,并返回结果字符串。
元音字母包括 'a'、'e'、'i'、'o'、'u'
,且可能以大小写两种形式出现不止一次。
示例 1:
输入:s = “hello”
输出:“holle”
示例 2:
输入:s = “leetcode”
输出:“leotcede”
提示:
1 <= s.length <= 3 * 10^5
s
由 可打印的 ASCII 字符组成题目来源: https://leetcode.cn/problems/reverse-vowels-of-a-string/description/
方法一:将所有的元音字母提出来反转,反转之后再替换原对应索引的元素
//将所有的元音字母提出来反转,反转之后再替换原对应索引的元素(hello为例)
function reverseVowels($s) {
$base_vowel_arr = ['a', 'e', 'i', 'o', 'u','A', 'E', 'I' , 'O', 'U'];
$vowel_arr = []; //元音字符数组 Array([0] => e,[1] => o)
$vowel_index_arr = []; //元音字符下标数组 Array([0] => 1,[1] => 4)
$s_arr = []; //输入的字符串数组 Array([0] => h,[1] => e,[2] => l,[3] => l,[4] => o)
// 先提取字符串的元音字符,并以原索引下标做键
for($i = 0; $i < strlen($s); $i++){
if(in_array($s[$i], $base_vowel_arr)){
$vowel_arr[] = $s[$i];
$vowel_index_arr[] = $i;
}
$s_arr[] = $s[$i];
}
//反转下标数组(array_reverse — 返回单元顺序相反的数组)
$re_vowel_index_arr = array_reverse($vowel_index_arr); //Array([0] => 4,[1] => 1)
$vowel_arr_new = []; //Array([4] => e,[1] => o)
//将元音字符数组的键值反转进行
foreach($vowel_arr as $key => $value){
$temp = $re_vowel_index_arr[$key];
$vowel_arr_new[$temp] = $value;
}
//替换对应元素
$ress = array_replace($s_arr, $vowel_arr_new);
return implode('',$ress);
}
方法二:双指针
function reverseVowels($s) {
$s_arr = str_split($s); //字符串转化成数组方便操作
$left = 0; //左指针
$right = count($s_arr) - 1; //右指针
$string = 'aeiouAEIOU'; //判断是否元音的字符串
while($left < $right){
if(strpos($string, $s_arr[$left]) !== false && strpos($string, $s_arr[$right]) !== false){
list($s_arr[$left], $s_arr[$right]) = [$s_arr[$right], $s_arr[$left]]; //都是元音,直接交换
$left++;
$right--;
}else if(strpos($string, $s_arr[$left]) !== false){
$right--;
}else if(strpos($string, $s_arr[$right]) !== false){
$left++;
}else{
$left++;
$right--;
}
}
return implode('',$s_arr); //再将数组转化成字符串返回
}
参考:
作者:ifelse
链接:https://leetcode.cn/problems/reverse-vowels-of-a-string/solutions/474520/phpdui-zhuang-zhi-zhen-by-mek1986/
来源:力扣(LeetCode)