leetcode讲解--647. Palindromic Substrings

题目

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

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

Example 1:code

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

Example 2:递归

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

Note:leetcode

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

题目地址字符串

讲解

题目的意思是:找出字符串中全部回文串,不一样位置的回文串不算同一个。这道题我只能想到从左到右按照从1到s.length的长度依次扫N遍。并且这还不包括判断是不是回文串这一步所用的时间。而判断回文串显然是能够有重复计算的子问题的,因此要用到动态规划。get

依旧是用规模从大到小的备忘录递归解法。这道题作下来仍是挺轻松的,我发现我愈来愈喜欢用递归了,对递归的掌控力也变强了。input

java代码

class Solution {
    private boolean[][] dp;
    public int countSubstrings(String s) {
        int result=0;
        dp = new boolean[s.length()][s.length()];
        for(int i=0;i<s.length();i++){
            for(int j=0;j+i<s.length();j++){
                dynamicProgramming(s, j, j+i);
            }
        }
        for(int i=0;i<dp.length;i++){
            for(int j=0;j<dp[i].length;j++){
                // System.out.println(i+","+j+"="+dp[i][j]);
                if(dp[i][j]){
                    result++;
                }
            }
        }
        return result;
    }
    
    private boolean dynamicProgramming(String s, int left, int right){
        if(left==right){
            dp[left][right] = true;
            return dp[left][right];
        }
        if(dp[left][right]){
            return dp[left][right];
        }
        if(s.charAt(left)!=s.charAt(right)){
            dp[left][right] = false;
            return dp[left][right];
        }else{
            if(right-left>1){
                dp[left][right] = dynamicProgramming(s, left+1, right-1);
                return dp[left][right];
            }else{
                dp[left][right] = true;
                return dp[left][right];
            }
        }
    }
}
相关文章
相关标签/搜索