← 返回编程题库
coding-string-valid-palindrome-check简单免费版2000ms未尝试

有效回文判断(仅字母数字、忽略大小写)

Valid Palindrome (Alphanumeric, Case-Insensitive)

开始编码

给一个 ASCII 字符串 s,长度在 0–10⁴ 之间。如果在 (1) 忽略非字母非数字的字符、(2) 把大小写视为等价 之后 s回文,返回 True,否则返回 False。经典例子是 "A man, a plan, a canal: Panama"——剥离标点和空格、把字母统一小写后得到 "amanaplanacanalpanama",正反读都一样。

请实现 solution(s: str) -> bool。最干净的写法是双指针向中间走i 在左端、j 在右端,先把 i 推过非字母数字,再把 j 收过非字母数字,然后比较 s[i].lower()s[j].lower()。一旦出现不等就返回 False,否则两个指针各往中间挪一步,直到 i >= j。空串和全标点输入都直接返回 True,因为外层循环根本不进入比较。

Examples

solution("A man, a plan, a canal: Panama") 返回 True。指针跳过 ' '','':',比较 A↔am↔ma↔n……忽略大小写后 21 对字符全部匹配。这是 LeetCode 125 的标准例子。

solution("race a car") 返回 False。跳过空格后比较序列是 r↔ra↔ac↔ce↔a——第 4 对就不等,函数提前结束,不需要扫完整个串。

solution("") 返回 True——外层 while i < ji = 0j = -1 下立刻为假,函数直接返回 True。同样的短路逻辑也覆盖 solution(".,!?"):两端指针互相穿过每个字符直到交错,根本不进入字符比较。

签名见 stubs/stub.py

Practical context

带字符分类过滤的回文判断在行情代码(ticker symbol)规范化和交易所行情管线里出现得比想象中更频繁。原始行情字符串往往是这种五花八门的形式——"BRK.B""BRK B""brk-b""BRK_B " 来自不同的供应商——而微观结构系统需要一步规范化:剥离分隔符、统一大小写,然后再去内存里的 dict[str, Instrument] 查找表里做相等比较。本题的「跳过 + 比较」双指针模式正是这套原语:扫两个串,跳过仅做格式作用的字符,对有意义的字符做大小写无关的比较。把「忽略非字母数字」换成「忽略 {'.', '-', '_', ' '} 这些分隔符」、把「比较 s[i] 和 s[j]」换成「比较 cleaned(a[i]) 和 cleaned(b[i])」,你就得到了一个零分配的交易所代码相等性函数。同样的模式还会出现在 FIX 报文 tag 规范化、ISIN/CUSIP 校验位剥离比较、以及自由文本交易员聊天搜索(让 "sell 100k AAPL" 匹配 "SELL 100K AAPL!!")里。把就地跳过这一步吃透,是这种比较能跑在行情处理器热路径上、又不会出现在火焰图里的关键。

约束条件

  • 0 ≤ len(s) ≤ 10^4
  • s 的所有字符都是 ASCII(码点 0–127)
  • 空字符串是合法输入,视为回文(返回 True)
  • 去掉非字母数字后为空也视为回文

样例

Case 1 · typical: classic LC125 sentence

输入: ["A man, a plan, a canal: Panama"]

期望: true

经典 LeetCode 125 例子。剥离非字母数字、统一小写后变成 "amanaplanacanalpanama",正反读相同,是回文。

Case 2 · typical: non-palindrome sentence

输入: ["race a car"]

期望: false

去掉空格后是 "raceacar",左右指针在第二步遇到 'a' vs 'c' 不等,不是回文。

Case 3 · edge: empty string

输入: [""]

期望: true

空串视为回文(循环条件 i < j 一开始就不满足,直接返回 True)。

最近提交

还没有提交记录。

编码区

实现 solution(...)。本地运行当前支持 Python 可见样例;服务端提交会运行可见样例和隐藏测试。

加载编辑器...
计时0:00

默认展示公开样例。点击「运行样例」后会在这里显示实际输出;点击「提交评测」会进入隐藏测试。

Case 1 · typical: classic LC125 sentence

输入: ["A man, a plan, a canal: Panama"]

期望: true

经典 LeetCode 125 例子。剥离非字母数字、统一小写后变成 "amanaplanacanalpanama",正反读相同,是回文。

Case 2 · typical: non-palindrome sentence

输入: ["race a car"]

期望: false

去掉空格后是 "raceacar",左右指针在第二步遇到 'a' vs 'c' 不等,不是回文。

Case 3 · edge: empty string

输入: [""]

期望: true

空串视为回文(循环条件 i < j 一开始就不满足,直接返回 True)。