LeetCode#345-Reverse Vowels of a String-反转字符串中的元音字母
一、题目
编写一个函数,以字符串作为输入,反转该字符串中的元音字母。
示例 1:
输入: "hello"
输出: "holle"
示例 2:
输入: "leetcode"
输出: "leotcede"
说明:元音字母不包含字母"y"。
二、题解
英语中的元音字母有 a, e, i, o, u 五个,考虑大小写的话,加上 A, E, I, O, U,遇到这些元音字母,需要反转元音字母,但其它辅音字母的位置不变。
这道题其实和 #344
题很像,用双指针法。遍历数组,一个指针从前向后扫描,一个指针从后向前扫描,当前后都扫描出元音,就交换两个元音。直到左指针大于等于右指针,就结束。
时间复杂度:O(N),空间复杂度:O(1)。
function reverseVowels($s) {
// 如果字符串为空,或只有一个字符,就没必要反转了
if (strlen($s) <= 1) {
return $s;
}
$vowelMap = ['a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U'];
$len = strlen($s);
$left = 0;
$right = $len - 1;
while ($left < $right) {
// 从左判断当前元素是不是元音,若不是,则 left 指针右移
while (!in_array($s[$left], $vowelMap) && $left < $len) {
$left++;
}
// 从右判断当前元素是不是元音,若不是,则 right 指针左移
while (!in_array($s[$right], $vowelMap) && $right >= 0) {
$right--;
}
// 如果没有元音
if ($left >= $right) {
break;
}
// 交换前后元音
// 如果前后元音相等,不需要交换了,直接移动左右指针
if ($s[$left] != $s[$right]) {
$temp = $s[$left];
$s[$left] = $s[$right];
$s[$right] = $temp;
}
$left++;
$right--;
}
return $s;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现