有效回文判断(仅字母数字、忽略大小写)
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↔a、m↔m、a↔n……忽略大小写后 21 对字符全部匹配。这是 LeetCode 125 的标准例子。
solution("race a car") 返回 False。跳过空格后比较序列是 r↔r、a↔a、c↔c、e↔a——第 4 对就不等,函数提前结束,不需要扫完整个串。
solution("") 返回 True——外层 while i < j 在 i = 0、j = -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 可见样例;服务端提交会运行可见样例和隐藏测试。
默认展示公开样例。点击「运行样例」后会在这里显示实际输出;点击「提交评测」会进入隐藏测试。
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)。