在字符串处理的世界里,回文是一个非常有趣的概念。所谓回文,就是指正读和反读都一样的字符串,比如 "上海自来水来自海上"、"aba" 等。在前端开发中,我们经常会遇到与回文相关的问题,今天就来深入探讨一下回文的判断方法以及相关扩展。
什么是回文?
回文是一种特殊的字符串结构,它的特点是从左到右读和从右到左读是完全相同的。例如:
-
简单回文:"aba"、"aaa"
-
中文回文:"上海自来水来自海上"
-
较长回文:"wwyyesseyyww"
基础回文判断实现
判断一个字符串是否为回文,最直观的思路有两种:
方法一:反转字符串对比
这种方法非常简单直接,将字符串反转后与原字符串进行比较,如果相同则为回文:
const str = 'juejin'
const newStr = str.split('').reverse().join('')
console.log(newStr); // 输出 "nijuej"
console.log(newStr === str); // 判断是否为回文
方法二:双指针法
通过左右两个指针向中间移动并对比字符的方式判断,这种方法更高效,不需要额外创建反转字符串:
function isPalindrome(s) {
let l = 0;
let r = s.length - 1;
while (l < r) {
if (s[l] !== s[r]) {
return false;
}
l++;
r--;
}
return true;
}
console.log(isPalindrome('yessey')); // 输出 true
console.log(isPalindrome('hello')); // 输出 false
进阶:最多删除一个字符的回文判断
有时候我们会遇到更复杂的情况,比如允许最多删除一个字符后判断是否能成为回文。这时候就需要对基础方法进行扩展:
var validPalindrome = function (s) {
const len = s.length
let i = 0
let j = len - 1
while (i < j) {
if (s[i] == s[j]) {
i++
j--
} else {
if (isPalindrome(i + 1, j)) {
return true
}
if (isPalindrome(i, j - 1)) {
return true
}
return false
}
}
function isPalindrome(l, r) {
while (l < r) {
if (s[l] == s[r]) {
l++
r--
} else {
return false
}
}
return true
}
return true
};
字符串操作的其他常用方法
在处理回文问题时,我们还会用到很多字符串操作方法,比如:
let str = 'hello world';
console.log(str.length); // 获取长度
console.log(str[1]); // 获取指定位置字符
console.log(str + ' hi'); // 字符串拼接
// 字符串分割与拼接
let arr = str.split(' ');//str 按照空格进行分割,并将分割后的结果存储在数组 arr 中
arr.splice(1, 0, '橘宝');
console.log(arr.join(' ')); // 输出 "hello 橘宝 world"
总结
回文判断是字符串处理中的经典问题,从简单的反转对比到复杂的双指针判断,每种方法都有其适用场景。掌握这些基础方法不仅能解决实际问题,还能帮助我们理解字符串操作的核心思想。
在实际开发中,我们需要根据具体需求选择合适的方法,比如追求简洁可以选择反转对比法,追求性能则可以选择双指针法。对于更复杂的场景,如允许删除字符的情况,也可以基于基础方法进行扩展实现。