【力扣】917.仅仅反转字母|每日一题|刷题打卡

170 阅读1分钟

一、题目描述

给你一个字符串 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 不含 '"' 或 '\'

二、思路分析

  1. 定义一个匹配所有非字母的正则
  2. 定义一个数组,保存非字母所对应的下标和值,是一个二维数组,例如:[[1,"-"],[4,"-"],[]...]
  3. 定义一个反转的函数,将字符所有字母进行反转
  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
}