LeetCode 125. 验证回文串 && 680. 验证回文字符串 Ⅱ
125题:https://leetcode-cn.com/problems/valid-palindrome/
这个题就是一个很标准的验证回文字符串,但是这个字符串又有点不一样,它有数字,有大写,有小写,甚至还有空格和非数字字符,根据题目意思,空格,非数字符号是不会被纳入评价范围的,同时判定的时候也不区分大小写。所以我们首先先把字符串统一转成大写或者是小写,然后去除空格。在双指针判断的时候遇到 小于‘0’ 或者 大于‘9’且小于‘a’ 或者大于'z’的情况下要直接将这边+1,寻找下一个位置。代码如下
class Solution { public boolean isPalindrome(String s) { if(s.length() == 0){ return true; } s = s.toLowerCase(); s = s.replaceAll(" ",""); int left = 0; int right = s.length()-1; while(left < right){ if(s.charAt(left) < '0' || (s.charAt(left) > '9' && s.charAt(left) < 'a') || s.charAt(left) > 'z'){ left++; continue; } if(s.charAt(right) < '0' || (s.charAt(right) > '9' && s.charAt(right) < 'a') || s.charAt(right) > 'z'){ right--; continue; } if(s.charAt(left) != s.charAt(right)){ return false; } left++; right--; } return true; } }
执行用时 :18 ms, 在所有 Java 提交中击败了20.09%的用户
内存消耗 :40.2 MB, 在所有 Java 提交中击败了7.14%的用户
2020年6月19日更新
class Solution { public boolean isPalindrome(String s) { char[] str = s.toLowerCase().toCharArray(); int left = 0; int right = str.length-1; while(left < right){ if(str[left] < '0' || (str[left] > '9' && str[left] < 'a') || str[left] >'z'){ left++; }else if(str[right] < '0' || (str[right] > '9' && str[right] < 'a') || str[right] >'z'){ right--; }else if(str[left] != str[right]){ return false; }else{ left++; right--; } } return true; } }
同样的思想,没想到一个月后的今天又遇到了这个题 哈哈,秒杀了。但是这次的击败的人数多了。
执行用时:3 ms, 在所有 Java 提交中击败了93.04%的用户
内存消耗:39.8 MB, 在所有 Java 提交中击败了7.14%的用户
这个是2020年5月19日的每日一题,这个题关键在于怎么利用只能删除一个的条件,我们设定i为左边指针,j为右边指针,如果s.charAt(i) != s.charAt(j)的时候,我们需要去分别判定[i,j-1]和[i+1,j]这两个字符串中是否有一个是回文,如果是就直接返回true,否则返回false。
最终解出来的答案还可以,代码如下
class Solution { public boolean validPalindrome(String s) { int left = 0; int right = s.length()-1; while(left < right){ if(s.charAt(left) != s.charAt(right)){ return check(s,left+1,right) || check(s,left,right-1); }else{ left++; right--; } } return true; } private boolean check(String s,int l, int r){ int left = l; int right = r; while(left < right){ if(s.charAt(left) != s.charAt(right)){ return false; } left++; right--; } return true; } }
执行用时 :8 ms, 在所有 Java 提交中击败了89.55%的用户
内存消耗 :40.1 MB, 在所有 Java 提交中击败了6.67%的用户