【算法】【字符串】验证回文串
1 题目
如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。
字母和数字都属于字母数字字符。
给你一个字符串 s
,如果它是 回文串 ,返回 true
;否则,返回 false
。
示例 1:
输入: s = "A man, a plan, a canal: Panama" 输出:true 解释:"amanaplanacanalpanama" 是回文串。
示例 2:
输入:s = "race a car" 输出:false 解释:"raceacar" 不是回文串。
示例 3:
输入:s = " " 输出:true 解释:在移除非字母数字字符之后,s 是一个空字符串 "" 。 由于空字符串正着反着读都一样,所以是回文串。
提示:
1 <= s.length <= 2 * 105
s
仅由可打印的 ASCII 字符组成
2 解答
class Solution { public boolean isPalindrome(String s) { // 参数边界校验 if (s == null || s.length() == 0) { return true; } // 因为有其他非字母字符存在,所以从中间往两边校验不行 // 所以从两边向中间校验即可 int leftIndex = 0; int rightIndex = s.length() - 1; // 左右指针 while (leftIndex < rightIndex) { // 左指针 不是数字字母字符的略过 while (leftIndex < rightIndex && !checkChar(s.charAt(leftIndex))) { leftIndex++; } // 右指针 不是数字字母字符的略过 while (leftIndex < rightIndex && !checkChar(s.charAt(rightIndex))) { rightIndex--; } // 如果左指针小于右指针 if (leftIndex < rightIndex) { // 两者不相等的话 直接返回 false if (changeChar(s.charAt(leftIndex)) != changeChar(s.charAt(rightIndex))) { return false; } } leftIndex++; rightIndex--; } // 遍历完说明是回文 return true; } /** * 校验字符是不是字母 */ private boolean checkChar(char c) { return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9') ? true : false; } /** * 转换字母统一为小写 */ private char changeChar(char c) { if ('A' <= c && c <= 'Z') { c = (char)(c + 32); } return c; } }
加油。