# 字符串
# 反转字符串
// 定义被反转的字符串
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))