反转字符串中的元音字母


反转字符串中的元音字母

题目

1
2
3
4
5
6
7
8
9
10
11
12
给你一个字符串 s ,仅反转字符串中的所有元音字母,并返回结果字符串
元音字母包括 'a'、'e'、'i'、'o'、'u',且可能以大小写两种形式出现不止一次

示例 1:
输入:s = "IceCreAm"
输出:"AceCreIm"
解释:
s 中的元音是 ['I', 'e', 'e', 'A']。反转这些元音,s 变为 "AceCreIm".

示例 2:
输入:s = "leetcode"
输出:"leotcede"

解法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
思路:
遍历字符串从左到右,内部遍历字符串从右到左,出现两个元音字母交换位置,直到两个遍历的下标相遇

代码:
/**
* @param String $s
* @return String
*/
function reverseVowels($s) {
// 元音字符串
$str = 'aeiouAEIOU';
$len = strlen($s);

$lastJ = $len - 1;
for ($i = 0; $i < $len - 1; $i++) {
// 两个遍历的下标相遇,结束遍历
if ($i >= $lastJ) {
return $s;
}

// 从左往右遍历,直到获取到元音字符
if (false === strpos($str, $s[$i])) {
continue;
}

// 从右向左遍历
for ($j = $lastJ; $j > 0; $j--) {
if (false === strpos($str, $s[$j])) {
continue;
}

// 直到获取到元音字符,替换字符位置
$temp = $s[$i];
$s[$i] = $s[$j];
$s[$j] = $temp;

// 记录遍历的下标,下次遍历从下标的左边一个下标开始
$lastJ = $j-1;
break;
}
}

return $s;
}