计算字符串中回文子串的个数 Palindromic Substrings

问题:this

Given a string, your task is to count how many palindromic substrings in this string.spa

The substrings with different start indexes or end indexes are counted as different substrings even they consist of same characters.递归

Example 1:字符串

Input: "abc"
Output: 3
Explanation: Three palindromic strings: "a", "b", "c".

Example 2:input

Input: "aaa"
Output: 6
Explanation: Six palindromic strings: "a", "a", "a", "aa", "aa", "aaa".

Note:string

  1. The input string length won't exceed 1000.

解决:it

①  计算字符串中回文子串的个数,使用动态规划解决:io

d[i][j]表示从i到j的字符串为是否回文,真则为(1),不然为假(0),class

那么d[i][j]为真的前提是:头尾两个字符串相同而且去掉头尾之后的字串也是回文(即d[i+1][j-1]为真),这里面要注意特殊状况,即:去掉头尾之后为空串,因此若是j-i<3,而且头尾相等,也是回文的。di

class Solution { //22ms
    public int countSubstrings(String s) {
        int len = s.length();
        int res = 0;
        boolean[][] dp = new boolean[len][len];
        for (int i = len - 1;i >= 0;i --){
            for (int j = i;j < len;j ++){
                dp[i][j] = ((s.charAt(i) == s.charAt(j) && ((j - i < 3) || dp[i + 1][j - 1])));
                if (dp[i][j]){
                    res ++;
                }
            }
        }
        return res;
    }
}

② 从中间向两边递归判断回文字符串。

class Solution { //12ms     public int countSubstrings(String s) {         if (s == null || s.length() == 0) return 0;         int len = s.length();         int res = 0;         for (int i = 0;i < len;i ++){             res += dfs(s,i,i);             res += dfs(s,i,i + 1);         }         return res;     }     public int dfs(String s,int left,int right){         int res = 0;         while(left >= 0 && right < s.length() && s.charAt(left) == s.charAt(right)){             left --;             right ++;             res ++;         }         return res;     } }

相关文章
相关标签/搜索