917. 仅仅反转字母
917. 仅仅反转字母
题目
Given a string s
, reverse the string according to the following rules:
- All the characters that are not English letters remain in the same position.
- All the English letters (lowercase or uppercase) should be reversed.
Return s
after reversing it.
Example 1:
Input: s = "ab-cd"
Output: "dc-ba"
Example 2:
Input: s = "a-bC-dEf-ghIj"
Output: "j-Ih-gfE-dCba"
Example 3:
Input: s = "Test1ng-Leet=code-Q!"
Output: "Qedo1ct-eeLg=ntse-T!"
Constraints:
1 <= s.length <= 100
s
consists of characters with ASCII values in the range[33, 122]
.s
does not contain'\"'
or'\\'
.
题目大意
给你一个字符串 s
,根据下述规则反转字符串:
- 所有非英文字母保留在原有位置。
- 所有英文字母(小写或大写)位置反转。
返回反转后的 s
。
示例 1:
输入: s = "ab-cd"
输出: "dc-ba"
示例 2:
输入: s = "a-bC-dEf-ghIj"
输出: "j-Ih-gfE-dCba"
示例 3:
输入: s = "Test1ng-Leet=code-Q!"
输出: "Qedo1ct-eeLg=ntse-T!"
提示
1 <= s.length <= 100
s
仅由 ASCII 值在范围[33, 122]
的字符组成s
不含'\"'
或'\\'
解题思路
可以使用双指针的方法,分别从字符串的两端向中间扫描,遇到字母时进行交换。
定义辅助函数
定义一个isLetter
函数,用于判断字符是否是字母(大小写均可)。初始化双指针
left
指针从字符串的开头开始。right
指针从字符串的末尾开始。
扫描和交换
- 如果
left
和right
所指向的字符中有非字母字符,则分别向内移动相应的指针,直到找到字母。 - 如果两指针指向的字符均为字母,则交换它们。
- 然后继续移动指针,重复上述步骤,直到
left >= right
。
- 如果
返回结果
- 将经过处理的数组转换回字符串并返回。
复杂度分析
- 时间复杂度:
O(n)
,遍历字符串一次。 - 空间复杂度:
O(n)
,使用了一个字符数组。
代码
/**
* @param {string} s
* @return {string}
*/
var reverseOnlyLetters = function (s) {
const isLetter = (char) => {
return (char >= 'a' && char <= 'z') || (char >= 'A' && char <= 'Z');
};
let arr = s.split('');
let left = 0,
right = arr.length - 1;
while (left < right) {
while (left < right && !isLetter(arr[left])) {
left++;
}
while (left < right && !isLetter(arr[right])) {
right--;
}
let temp = s[left];
arr[left] = arr[right];
arr[right] = temp;
left++;
right--;
}
return arr.join('');
};
相关题目
题号 | 标题 | 题解 | 标签 | 难度 | 力扣 |
---|---|---|---|---|---|
2810 | 故障键盘 | 字符串 模拟 | 🟢 | 🀄️ 🔗 |