雙指針算法

1. 驗證迴文字符串

題目

給定一個字符串,驗證它是不是迴文串,只考慮字母和數字字符,能夠忽略字母的大小寫。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;
    }
}

 

2. 驗證迴文字符串II

題目

給定一個非空字符串 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;
    }
}
相關文章
相關標籤/搜索