一、题目描述
给你一个字符串 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 <= 100s仅由 ASCII 值在范围[33, 122]的字符组成s不含'"'或'\'
二、思路分析
- 定义一个匹配所有非字母的正则
- 定义一个数组,保存非字母所对应的下标和值,是一个二维数组,例如:
[[1,"-"],[4,"-"],[]...] - 定义一个反转的函数,将字符所有字母进行反转
- 然后使用
split的方式转成数组,利用splice方法在指定的位置插入元素即可(所有非英文字母保留在原有位置)
三、代码答案
/**
* @param {string} s
* @return {string}
*/
// 1.定义一个正则,匹配所有的非字母
const reg = /[^a-zA-Z]/
var reverseOnlyLetters = function (s) {
// 定义一个非字母的下标数组
const nonalphabeticPosition = []
for (var i = 0; i < s.length; i++) {
if (reg.test(s[i])) {
nonalphabeticPosition.push([i,s[i]])
}
}
const reverseArr = reserve(s).split("")
// 将非字母插入对应的位置(即所有非英文字母保留在原有位置)
for (var j = 0; j < nonalphabeticPosition.length; j++) {
const [index, val] = nonalphabeticPosition[j]
reverseArr.splice(index, 0,val)
}
return reverseArr.join("")
};
// 反转函数
function reserve(s) {
let re = ''
for (var i = s.length - 1; i >= 0; i--) {
if (!reg.test(s[i])) {
re += s[i]
}
}
return re
}