96SEO 2026-09-06 09:30 7
"yessey" 正着读和反着读都是 "yessey",这就是回文。主要特征是对称性: 第 i 个字符等于倒数第 i 个字符,一直到中间。说起来,

思路:
// 字符串 → split 成数组 → reverse 逆序 → join 成字符串
function isPalindrome {
const reversedStr = str.split.reverse.join;return reversedStr === str;}
优点:
缺点:
思路: 利用对称性,从两端向中间比较。
function isPalindrome {
const len = str.length;for {
if {
return false;}
}
return true;}
*i* 从左往右走,*len - i - 1* 从右往左走。只要发现不相等即返回 false,全程遍历不到一半长度。
"给定非空字符串 s,最多删除一个字符后是否能成为回文?"
*递归解法* :每次遇到冲突时尝试删左或删右,接下来递归检查剩余子串。虽然易于理解,但每次调用都会产生栈帧,空间复杂度 O。下面演示一种常见实现:
function validPalindrome {
let i = 0,j = s.length - 1;while { // 前置匹配
i++;j--,话说回来,}
// 若已匹配完。则肯定是回文
if return true;// 尝试删左边或删右边
return isPal || isPal;}
function isPal { // 判断子串是否为回文
while {
l++;r--,}
return l>= r;}
*哨兵双指针解法* :使用状态标记记录是否已跳过一次再用单个 while 循环完成全部判断,无递归开销。以下示例演示关键实现细节:
function validPalindrome {
let left =,right = s.length -;let state =,// 未跳过 : 'none',跳过左边 : 'left'。跳过右边 : 'right'
while {
if { // 相等则继续移动两端
left++;right--,continue;}
// 冲突且已经跳过一次 -> 无效
if return false;// 尝试跳过左侧字符
let l = left +,r = right;let okLeft = true;while { l++,r--;}
if okLeft = true;老实说,if { state =;left++,continue;}
// 尝试跳过右侧字符
l = left;老实说,r = right -;let okRight = true;while { l++,r--;
}
if okRight = true;if { state = -;老实说,right--,continue;}
// 两种方式均不可行
return false;}
return true;其实,}
*关键点*
| 维度 对比方式 | 递归版本 | 哨兵迭代版本 |
|---|
,所以仅几个临时变量。占用 O 内存.
,再做 ;即使前者成功仍要进入后者.
*主要原因* : 状态标记只能记录“是否已使用一次”这一信息。而无法记录多次决策方法与方向,所以无法支持 k 次以上删除场景。
B. "x" 能告诉我们“已经用了一次”。但它既没有记录我们是在那一步选择了哪条分支,也没有办法在之后出现新的冲突时退回来换另一条方法。
C. "x" 的三种取值 对于“一次错误”足够,但对于k≥2 的情形根本不足以描述所有可能状态。
D. 由于缺乏完整状态信息。它无法支持后续再决策与回溯,从而失去了对多步错误修正能力。“
举例:
假设字符串 ""abecbea"",允许删除两个字符就能成为回文。
实际方案: 删除索引 'c'再删除索引 'b'得到""abeba"",是有效回文。
哨兵版本:
– 第一次冲突处 e vs b;不过,若先选择删左边 e。则通过检查成功并设置 x 为 ''left'';– 下一轮
冲突 c vs b,此时 x 已被占用 => **立即返回 false**。
只是如果第一次选择删右边 b。再接着删 c,就能得到合法答案;其实,但因为没有办法退回来重选,所以哨兵方法失效。
结论 : 哨兵方法是一把“双刃剑”。对于 “最多删 k 个” 的通用问题,需要采用动态规划或深度优先搜索 + memoization 来完整探索所有可能方法。
P.S.: 回文判定之所以被频繁提问。是因为它兼具算法严谨与编程实践价值——掌握几种实现方式,可以应付不同风格面试与真实业务场景。
-
$\bullet$ split 对中文、emoji 等 Unicode 是否完全正确?怎么说呢,如 '👨👩👦'.split?老实说,$ \rightarrow $ 它会把复合表情拆成多个码位。并不能保证语义一致,$ \bullet$ 在“双指针”里循环条件写成 $i<$len/2$<$i<$=len/2$? 为什么不用 <=?
$ \rightarrow $ 当长度为偶数时中间位置不会参与比较;当长度为奇数时中间字母自然相等,可忽略。
$ \bullet$ 哨兵版本里 $x=''$, $x=-$ 分别代表什么? 为什么区分方向?
$ \rightarrow $ 区分可以帮助我们知道已跳过哪一侧,以便在后续
冲突时避免重复尝试相同方向导致死循环。
$ \bullet$ 如果改成 “最多删 k 个”,会出现哪些问题? 请构造反例?
$ \rightarrow $ 像上方举例 “abecbea” 就能说明,仅依赖单个布尔 flag 无法决定最佳路径。
$ \bullet$ 动态规划处理 “删除 k 个” 时状态转移方程是什么?
$\displaystyle dp=\min+$
表示从子串 到达平衡所需最小 deletions.
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback