题目描述
给你一个字符串 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!”
代码片
/*
* @lc app=leetcode.cn id=917 lang=javascript
*
* [917] 仅仅反转字母
*/
// @lc code=start
/**
* @param {string} s
* @return {string}
*/
//方法一:栈
var reverseOnlyLetters = function(s) {
let stack = [];
let i = 0;
//只要遇到字母就把它存入栈中
while(i < s.length) {
let cur = s.charCodeAt(i);
while((cur >= 97 && cur <= 122) || (cur >= 65 && cur <= 90)) {
stack.push(s[i]);
i++;
cur = s.charCodeAt(i);
}
i++;
}
let res = "";
i = 0;
//下次遍历的时候 只要是字母 就从栈中弹出 即可一一对应
while (i < s.length) {
let cur = s.charCodeAt(i);
while((cur >= 97 && cur <= 122) || (cur >= 65 && cur <= 90)) {
res += stack.pop();
i++;
cur = s.charCodeAt(i);
}
res += s[i] || "";
i++;
}
return res;
};
// @lc code=end
/**
* @param {string} s
* @return {string}
*/
var reverseOnlyLetters = function (s) {
let left = 0,
right = s.length - 1;
let stack = s.split("");
while (left <= right) {
let leftChar = s.charCodeAt(left),
isLeftChar =
(leftChar >= 97 && leftChar <= 122) ||
(leftChar >= 65 && leftChar <= 90);
let rightChart = s.charCodeAt(right),
isRightChar =
(rightChart >= 97 && rightChart <= 122) ||
(rightChart >= 65 && rightChart <= 90);
// 当左右指针指向都指向的是字母的情况下 就互相交换
if (isLeftChar && isRightChar) {
[stack[left], stack[right]] = [stack[right], stack[left]];
left++;
right--;
}
// 左指针指向的不是字母,向右移动1位
if (!isLeftChar) left++;
// 右指针指向的不是字母,向左移动1位
if (!isRightChar) right--;
}
return stack.join("");
};