647. 回文子串

https://leetcode-cn.com/problems/palindromic-substrings/

  • 暴力

    class Solution {
        public int countSubstrings(String s) {
            int count=0;
            for(int i=0;i<s.length();i++){
                for(int j=i;j<s.length();j++){
                    if(isHuiWen(s,i,j)==true){
                        count++;
                    }
                }
            }
            return count;
        }
    
    
        public Boolean isHuiWen(String s,int l,int r){
            int left = l,right=r;
            while (left<=right){
                if(s.charAt(left)!=s.charAt(right)){
                    return false;
                }
                left++;
                right--;
            }
            return true;
        }
    }
    
  • 动态规划
/*
    状态:dp[i][j] 表示字符串s在[i,j]区间的子串是否是一个回文串。
    状态转移方程:当 s[i] == s[j] && (j - i < 2 || dp[i + 1][j - 1]) 时,dp[i][j]=true,否则为false

  解释:
    当只有一个字符时,比如 a 自然是一个回文串。
    当有两个字符时,如果是相等的,比如 aa,也是一个回文串。
    当有三个及以上字符时,比如 ababa 这个字符记作串 1,把两边的 a 去掉,也就是 bab 记作串 2,可以看出只要串2是一个回文串,那么左右各多了一个 a 的串 1 必定也是回文串。所以当 s[i]==s[j] 时,自然要看 dp[i+1][j-1] 是不是一个回文串

*/

public static int countSubstrings(String s) {
    boolean[][] dp = new boolean[s.length()][s.length()];
    int ans = 0;

    for(int i=0;i<s.length();i++){
        for(int j=0;j<=i;j++){
            if((s.charAt(i)==s.charAt(j))&&(i-j<2||dp[j+1][i-1])){
                dp[j][i]=true;
                ans++;
            }
        }
    }
    return ans;
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容