题目描述
有效的回文
给定一个字符串 s ,验证 s 是否是 回文串 ,只考虑字母和数字字符,可以忽略字母的大小写。
本题中,将空字符串定义为有效的 回文串 。
输入: s = "A man, a plan, a canal: Panama"输出: true解释:"amanaplanacanalpanama" 是回文串
输入: s = "race a car"输出: false解释:"raceacar" 不是回文串
解题思路
双指针,前后匹配而已,确实是难度简单
一是先转小写之后用正则的方式替换掉不需要考虑的字符,然后前后匹配
优化的话就双指针while循环中直接忽略掉不需要考虑字符
实现代码
class IsPalindrome {// 预处理后再双指针public boolean isPalindrome(String s) {//先变小写,再正则替换s = s.toLowerCase().replaceAll("[^a-z0-9]", "");int n = s.length()/2;for (int i = 0; i < n; i++) {if (s.charAt(i) != s.charAt(s.length()-1-i)) {return false;}}return true;}// 双指针优化public boolean doublePointIsPalindrome(String s) {int i = 0, j = s.length()-1;s = s.toLowerCase();while(i<j) {while (!Character.isLetterOrDigit(s.charAt(i))&&i<j) {i++;}while (!Character.isLetterOrDigit(s.charAt(j))&&i<j) {j--;}if(s.charAt(i++)!=s.charAt(j--)){return false;}}return true;}}
时间及空间复杂度分析
时间复杂度O(N)
用正则进行预处理虽然简洁,但是时间耗时多了
不用正则的话,直接双指针忽略就快多了,2-3ms
空间复杂度O(1)
拓展思路
看到一个用递归计算的,好像也行得通,妙啊👍
