回文判断的核心是双指针原地比对:设left=0、right=len-1,循环比较arr[left]与arr[right],不等则返回false,相等则收缩指针;预处理可跳过非字母数字字符并转小写,保持o(1)空间复杂度。

用数据结构结合字符数组操作判断回文,核心在于利用双指针+原地比对,不依赖额外字符串或复杂结构,效率高、内存省、逻辑清晰。
双指针法:最直接的字符数组操作
字符数组天然支持随机访问,只需两个整型变量作索引,从首尾向中间收缩扫描:
- 设 left = 0,right = len - 1(len 为数组实际有效长度,不含 '\0')
- 循环条件:left
- 每次比较 arr[left] == arr[right];不等则立即返回 false
- 相等则 left++,right--,继续下一轮
- 循环自然退出(left ≥ right)说明所有对应位都匹配,是回文
预处理:应对真实场景中的干扰字符
题目若要求“只考虑字母数字,忽略大小写和标点”,需在比对前做轻量清洗——仍基于字符数组,不生成新串:
- 用两个指针遍历原数组,跳过非字母数字字符(如 isalnum() 判断)
- 比对时统一转小写(如 tolower())
- 无需复制新数组,边走边跳、边比边转,空间复杂度保持 O(1)
递归结构:体现分治思想的数据结构视角
把字符数组看作可分割的线性结构,递归本质是隐式栈的应用:
- 函数接收起始索引 low 和结束索引 high
- 终止条件:low ≥ high → 返回 true
- 若 arr[low] ≠ arr[high] → 返回 false
- 否则递归检查子区间 [low+1, high−1]
- 虽用栈空间,但代码简洁,体现“回文的子串仍是回文”这一结构性质
避免常见误区
有些做法看似简单,实则偏离“字符数组+数据结构”的本意:
- 用 strrev() 或拼接反转串 → 生成新数组,违背原地操作原则
- 全量预处理成新 clean 数组 → 多一次遍历和额外空间,非必要
- 只检查到 len/2 就停止但未控制边界 → 易在奇偶长度交界处出错
- 忽略 '\0' 截断或越界访问 → C/C++ 中必须确保 right 不超有效范围











