# 字符串

# 反转字符串

// 定义被反转的字符串
const str = 'juejin'
// 定义反转后的字符串
const res = str
  .split('')
  .reverse()
  .join('')
// split() 方法使用指定的分隔符字符串将一个String对象分割成子字符串数组,以一个指定的分割字串来决定每个拆分的位置
// reverse() 方法将数组中元素的位置颠倒,并返回该数组。数组的第一个元素会变成最后一个,数组的最后一个元素变成第一个。该方法会改变原数组。
// join() 方法将一个数组(或一个类数组对象)的所有元素连接成一个字符串并返回这个字符串。如果数组只有一个项目,那么将返回该项目而不使用分隔符
console.log(res) // nijeuj

# 判断是否是回文

方式一

const isPalindrome = str => {
  const palindrome = str
    .split()
    .reverse()
    .join()
  return str === palindrome
}

方式二

const isPalindrome = str => {
  const len = str.length

  for (let i = 0; i < len / 2; i++) {
    if (str[i] === str[len - 1 - i]) {
    } else {
      return false
    }
  }
  return true
}

双指针场景下 判断回文方法

const str = 'abc'

const isPalindrome = (left, right) => {
  while (left < right) {
    if (str[left] !== str[right]) {
      return false
    }
    left++
    right--
  }
  return true
}

console.log(isPalindrome(0, str.length - 1))

TIP

字符串题干中若有“回文”关键字,那么做题时脑海中一定要冒出两个关键字——对称性 和 双指针。这两个工具一起上,足以解决大部分的回文字符串衍生问题。

# 真题

真题描述:给定一个非空字符串 s,最多删除一个字符。判断是否能成为回文字符串。

输入: "aba" 输出: True 输入: "abca" 输出: True

const str = 'aaccaab'

function deletePalindrome(str){
  const isPalindrome = (start,end)=>{
    while(start<end){
      if(str[start]!==str[end]){
        return false
      }
      start++
      end--
    }
    return true
  }
  let l = 0
  let r = str.length-1
  while(l<r){
    if(str[l]===str[r]){
      l++
      r--
    }else{
      break
    }
  }
  // 如果左右两边指针不相等 就需要验证左边指针下一位 或者右边指针的下一位是不是相等的
  if(isPalindrome(l+1,r)){
    return true
  }
  if(isPalindrome(l,r-1)){
    return true
  }
  return false
}


console.log(deletePalindrome(str))

上次更新: 11/29/2021, 4:24:52 PM