回文串是正读和反读都一样的字符串。我们可以使用双指针法实现回文串判断算法:
public boolean isPalindrome(String s) {
s = s.toLowerCase();
s = s.replaceAll("[^a-zA-Z0-9]", "");
int i = 0;
int j = s.length() - 1;
while (i < j) {
if (s.charAt(i) != s.charAt(j)) return false;
i++;
j--;
}
return true;
}
算法流程:
- 将字符串转为小写,并去除非字母和数字的字符。得到规范后的字符串 s。
- 对 s 的两头设置左右指针 i 和 j。
- 比较 i 和 j 指向的字符,如果相等则同时移动 i 和 j。
- 如果不相等,则 s 不是回文串,返回 false。
- 如果指针 i 与 j 重合或交叉,则比较完成,s 是回文串,返回 true。
时间复杂度 O(n),空间复杂度 O(1)。
所以,回文串判断的关键是:
- 规范化字符串,转小写并去除非字母和数字字符。
- 设置左右指针,从两头向中间比较字符。
- 若字符相等则同时移动指针,若不相等则不是回文串,返回false。
- 指针重合代表比较完成,是回文串,返回true。