917. 仅仅反转字母https://leetcode.cn/problems/reverse-only-letters/
难度简单189
给你一个字符串 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
不含'\"'
或'\\'
题解:
这道题可以使用双指针,分别从头尾向中间遍历,在指针向中心移动过程中,交换头尾指针的值,同时判断当前指针所指向的值是否是非字母字符,是则跳过,不是则进行交换。
/**
* @param {string} s
* @return {string}
*/
var reverseOnlyLetters = function(s) {
let arr = s.split("");
let head = 0;
let temp;
var re = /[A-Za-z]+/;
let tail = arr.length - 1;
// console.log(arr, head, tail);
for (; head != tail, tail > head; ) {
// console.log("head:", arr[head], head, "tail:", arr[tail], tail);
if (re.test(arr[head]) && re.test(arr[tail])) {
// console.log(arr[tail], arr[head]);
temp = arr[tail];
arr[tail] = arr[head];
arr[head] = temp;
// console.log("交换了");
// console.log(arr[tail], arr[head]);
head++;
tail--;
}
if (!re.test(arr[head])) {
head++;
}
if (!re.test(arr[tail])) {
tail--;
}
}
let str = arr.join("");
// console.log(arr);
// console.log(str);
return str;
};