5题目描述:

给你一个字符串s,找到s中最长的回文子串。

解析:

1.如果字符串长度小于2,直接返回原字符串
2.定义两个变量,一个start存储当前找到的最大回文字符串的起始位置,
另一个maxLength记录字符串的长度(终止位置就是start+maxLength)
3.创建一个helper function,判断左边和右边是否越界,同时最左边的字符是否等于最右边的字符。
如果以上三个条件都满足,则判断是否需要更新回文字符串最大长度及最大字符串的起始位置,
然后将left--,right++,继续判断,知道不满足三个条件之一。
4.遍历字符串,每个位置调用helper function两遍
第一遍检查i-1和i+1
第二遍检查i和i+1

Java:

private int start = 0, maxLength = 1;
    public String longestPalindrome(String s) {
        if(s.length() < 2) {
            return s;
        }
        for(int i = 0; i < s.length(); i++) {
            expandAroundCenter(s, i-1, i+1);
            expandAroundCenter(s, i, i+1);
        }
        return s.substring(start, start + maxLength);
    }
    private void expandAroundCenter(String s, int left, int right) {
        while(left >= 0 && right < s.length() && s.charAt(left) == s.charAt(right)) {
            if(right - left + 1 > maxLength) {
                maxLength = right - left + 1;
                start = left;
            }
            left--;
            right++;
        }
    }

JavaScript:

var longestPalindrome = function(s) {
    if(s.length < 2) {
        return s;
    }
    let start = 0;
    let maxLength = 1;
    function expandAroundCenter(left, right) {
        while(left >= 0 && right < s.length && s[left] === s[right]) {
            if(right - left + 1 > maxLength) {
                maxLength = right - left + 1;
                start = left;
            }
            left--;
            right++;
        }
    }
    for(let i = 0; i < s.length; i++) {
        expandAroundCenter(i-1, i+1);
        expandAroundCenter(i,i+1);
    }
    return s.substring(start, start + maxLength);
};

125题目描述:

给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。

说明:本题中,我们将空字符串定义为有效的回文串。

解析:

双指针

Java:

class Solution {
    public boolean isPalindrome(String s) {
        if(s.isEmpty()) {
            return true;
        }
        int left = 0, right = s.length() - 1;
        while(left < right) {
            if(!Character.isLetterOrDigit(s.charAt(left))) {
                left++;
                continue;
            }
            if(!Character.isLetterOrDigit(s.charAt(right))) {
                right--;
                continue;
            }
            if(Character.toLowerCase(s.charAt(left)) != Character.toLowerCase(s.charAt(right))) {
                return false;
            }
            left++;
            right--;
        }
        return true;
    }
}

JavaScript:

var isPalindrome = function(s) {
    s = s.toLowerCase().replace(/[\W_]/g, "");
    if(s.length < 2) {
        return true;
    }
    let left = 0;
    let right = s.length - 1;
    while(left < right) {
        if(s[left] !== s[right]) {
            return false;
        }
        left++;
        right--;
    }
    return true;
};