[String]680. Valid Palindrome II 回文字符串2

題目:680. Valid Palindrome II

Given a non-empty string s, you may delete at most one character. Judge whether you can make it a palindrome.

Example 1:
Input: "aba"
Output: True
Example 2:
Input: "abca"
Output: True
Explanation: You could delete the character 'c'.
Note:
The string will only contain lowercase characters a-z. The maximum length of the string is 50000.

第一次:
想法是當(dāng)?shù)谝淮斡龅讲煌瑒t比較左下一位是否與右當(dāng)前一致,一致則左+1;否則比較右+1位和左當(dāng)前;都不一致則返回false。
458 / 460 test cases passed.
失敗于"cuppucu" 這樣的例子,刪左刪右結(jié)果不同

class Solution {
    public boolean validPalindrome(String s) {
        boolean delete = false;
        int len = s.length();
        if(len <= 2 && len >= 0) return true;
        
        for(int i =0, j = len-1;i<j;i++,j--){
            if(s.charAt(i) != s.charAt(j)){
                if(!delete){
                    delete = true;
                    if(s.charAt(i+1) == s.charAt(j)){
                        i++;
                    }else if(s.charAt(i) == s.charAt(j-1)){
                        j--;
                    }else return false;
                }else{
                    return false;
                }
            }
        }
        return true;
    }
}

第二次嘗試:
460 / 460 test cases passed.
Runtime: 349 ms
效率非常低下

class Solution {
    public boolean validPalindrome(String s) {
        boolean delete = false;
        int len = s.length();
        if(len <= 2 && len >= 0) return true;
                   

        for(int i =0, j = len-1;i<j;i++,j--){
            if(s.charAt(i) != s.charAt(j)){
                    if(s.charAt(i+1) == s.charAt(j)){ //左刪一位可以的情況下,先嘗試這種辦法
                        int i2 = i+1, j2 = j;
                        while(i2 < j2){
                            if(s.charAt(i2) != s.charAt(j2)) break;
                            i2++;j2--;
                            if(i2>=j2) return true;
                        }
                    }else{//左刪不可以,或者左刪嘗試失敗時(shí) 嘗試右刪,右刪再失敗就失敗
                        j = j-1;
                        while(i < j){
                            if(s.charAt(i) != s.charAt(j)) return false;
                            i++;j--;
                        }
                    }
            }
        }
        return true;      
    }
}

分享一下優(yōu)秀版:
所以這么簡單的道理,到底為什么自己想的那么復(fù)雜呢?

class Solution {
    public boolean validPalindrome(String s) {
        int l = -1, r = s.length();
        while (++l < --r) {
            if (s.charAt(l) != s.charAt(r)) return isPalindromic(s, l, r+1) || isPalindromic(s, l-1, r);//左刪or右刪
        }
        return true;
    }
    private boolean isPalindromic(String s, int l, int r) {
        while (++l < --r) {
            if (s.charAt(l) != s.charAt(r)) return false;
        }
        return true;
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問題, 分享了一些自己做題目的經(jīng)驗(yàn)。 張土汪:刷leetcod...
    土汪閱讀 12,771評(píng)論 0 33
  • Correctness AdapterViewChildren Summary: AdapterViews can...
    MarcusMa閱讀 8,925評(píng)論 0 6
  • 序夢/十五夢來由 小的時(shí)候最不喜歡的事情就是睡覺,當(dāng)然也不會(huì)太在意它的附屬產(chǎn)品,大大小小的夢,現(xiàn)在想來,真是犯賤,...
    就是笑笑啊_閱讀 403評(píng)論 7 1
  • 再次見面很神奇 每年都會(huì)記得我的生日,可能因?yàn)樘脹]有戀愛,我竟有些胡思亂想,夜晚意志力總是很薄弱,關(guān)了燈的房間,...
    等風(fēng)來襲閱讀 260評(píng)論 0 0
  • 昨夜剛仰頭詢問老天:“明天清明會(huì)下雨嗎?”今早竟然真的聽到了我的心聲。感動(dòng)!隨便寫寫,來抒發(fā)一下內(nèi)心的情懷。...
    靜雅如初閱讀 238評(píng)論 0 3