給定一個字符串,驗證它是不是迴文串,只考慮字母和數字字符,能夠忽略字母的大小寫。git
說明:本題中,咱們將空字符串定義爲有效的迴文串。算法
示例 1:網絡
輸入: "A man, a plan, a canal: Panama"
輸出: true
示例 2:spa
輸入: "race a car"
輸出: false指針
來源:力扣(LeetCode)
連接:https://leetcode-cn.com/problems/valid-palindrome
著做權歸領釦網絡全部。商業轉載請聯繫官方受權,非商業轉載請註明出處。code
雙指針算法的基本應用,從兩邊向中心移動,遇到不符條件的字符跳過。blog
class Solution { public boolean isPalindrome(String s) { if(s == null || s.length() == 0){ return true; } int left = 0, right = s.length() - 1; while(left < right){ while(left < right && !Character.isLetter(s.charAt(left)) && !Character.isDigit(s.charAt(left))) { left++; } while(left < right && !Character.isLetter(s.charAt(right)) && !Character.isDigit(s.charAt(right))) { right--; } if(left < right && Character.toLowerCase(s.charAt(left)) != Character.toLowerCase(s.charAt(right))){ return false; } left++; right--; } return true; } }
給定一個非空字符串 s,最多刪除一個字符。判斷是否能成爲迴文字符串。leetcode
示例 1:字符串
輸入: "aba"
輸出: True
示例 2:it
輸入: "abca"
輸出: True
解釋: 你能夠刪除c字符。
注意:
字符串只包含從 a-z 的小寫字母。字符串的最大長度是50000。
來源:力扣(LeetCode)
連接:https://leetcode-cn.com/problems/valid-palindrome-ii
著做權歸領釦網絡全部。商業轉載請聯繫官方受權,非商業轉載請註明出處。
從左右兩端開始驗證是不是迴文串,驗證的過程當中,若兩個字符不等,再左右各加一或減一,驗證一遍。
class Solution { public boolean validPalindrome(String s) { if(s == null || s.length() == 0){ return true; } int left = 0, right = s.length() - 1; while(left < right){ if(s.charAt(left) != s.charAt(right)){ break; } left++; right--; } if(left >= right) return true; return isPalindrome(s, left + 1, right) || isPalindrome(s, left, right - 1); } public boolean isPalindrome(String s, int left, int right) { while(left < right){ if(s.charAt(left) != s.charAt(right)){ return false; } left++; right--; } return true; } }