【LeetCode】647. 回文子串

【LeetCode】647. 回文子串_第1张图片

我的思路是暴力遍历。遍历所有可能的子串。借助一个方法,能够判断一个字符串是不是回文的。

速度很慢,需另寻他法。

【LeetCode】647. 回文子串_第2张图片

public class Solution {
    public int countSubstrings(String s) {
        // 用遍历的方法
        int res = 0;
        int len = s.length();
        for (int i = 1; i <= len ; i++) {// 子字符串的长度:1,2,3....len
            for (int j = 0; j <= len-i; j++) { // 子串开始的序号。
                int end = i+j-1;// 最后一位字符的序号。
                String str = s.substring(j,end+1);
                if(method(str)){
                    res ++;
                }
            }

        }
        return res;
    }

    private boolean method(String str) {
        int i = 0;
        int j = str.length()-1;
        while (i<j){
            if(str.charAt(i)!=str.charAt(j)){
                return false;
            }
            i ++;
            j --;
        }
        return true;
    }

}

用一个中心扩展的方法

遍历中心位置,然后向两端扩展,如果可以扩展的话,res++。

【LeetCode】647. 回文子串_第3张图片

public class Solution {
    public int countSubstrings(String s) {
        // 中心扩展方法
        int len = s.length();
        int res = 0;
        // 假设len = 5。 字符,空,字符,空.... 序号分别为0,1,2,3....
        // 字符的序号为:原始字符序号*2,
        for (int i = 0; i < 2 * len - 1; i++) {
            int left;
            int right;
            if (i % 2 == 0) {// 说明中心是一个字符
                res++;
                left = i / 2 - 1;
                right = i / 2 + 1;
            } else { // 说明中心是一个空位置
                left = i / 2;
                right = i / 2 + 1;

            }

            while (left >= 0 && right < len && s.charAt(left) == s.charAt(right)) {
                res++;
                left--;
                right++;
            }
        }
        return res;
    }
}

你可能感兴趣的:(【LeetCode】647. 回文子串)