欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

680. Valid Palindrome II

程序员文章站 2024-03-06 22:05:14
...

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'.

这题是'Easy',但是值得一做。我一开始审题不清,没注意at most这个词,以为必须要删掉一个了,结果写了个O(m*n)的做法,把每个字母都去掉一遍,然后reverse,看跟原串是否一致。
后来我有个一个思路,第一次遇到不一致的,就跳过,左边跳还是右边跳要判断一下,但是没法AC,感觉这做法确实有问题。

最后我又有了个思路:
遇到不一致的,直接把响应的两个都char都去掉,reverse一下(其实不需要reverse..首位对比就行),如果有一个等于原串,就return true。AC了。

    public boolean validPalindrome(String s) {
        if (s == null) return true;
        boolean firstTime = true;
        int start = 0, end = s.length() - 1;
        while (start < end) {
            if (s.charAt(start) != s.charAt(end)) {
                String t1 = s.substring(0, start) + s.substring(start + 1);
                String t2 = s.substring(0, end) + s.substring(end + 1);
                if (reverse(t1).equals(t1) || reverse(t2).equals(t2)) {
                    return true;
                } else
                    return false;
            }
            start++;
            end--;
        }
        return true;
    }

    private String reverse(String s) {
        StringBuilder sb = new StringBuilder(s.length());
        int end = s.length() - 1;
        for (int i = end; i >= 0; i--) {
            sb.append(s.charAt(i));
        }
        return sb.toString();
    }

别人的写法:

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);
    return true;
}
public boolean isPalindromic(String s, int l, int r) {
    while (++l < --r) 
        if (s.charAt(l) != s.charAt(r)) return false;
    return true;
}