LeetCode647. 回文子串

这篇博客介绍了一种使用动态规划算法来找出字符串中回文子串的数量的方法。通过定义dp数组并建立递推公式,实现了从下标i到j的子串是否为回文的判断。在初始化dp数组后,自左向右、自下而上遍历,统计回文子串。最终返回回文子串的总数。

思路

1.定义dp数组

dp[i][j]表示从下标i开始j结束的字符串如果是回文串的话,dp[i][j] = true;反之为false。

2.定义递推公式

如果s.charAt(i) != s.charAt(j);那么必定不是回文串,所以dp[i][j] = false.

如果相等则判断i和j的位置,如果距离小于等于2。则一定是回文串;如果距离大于2则需要判断dp[i+1][j-1]是否为回文串了。

3.初始化dp数组

根据定义dp数组的每个元素都为false。

4.遍历dp数组

根据递推公式,dp[i][j]和dp[i+1][j-1]有关,所以需要自左到右,自下向上遍历。所以先遍历j在遍历i

5.打印dp数组

最后的结果用result存储了。输出result即可。或者遍历dp数组,统计值为true的个数。

代码

class Solution {
    public int countSubstrings(String s) {
        int l = s.length();
        int result = 0;
        boolean dp[][] = new boolean[l][l];
        for(int j = 0;j<l;j++){
            for(int i = 0;i<=j;i++){
                if(s.charAt(i) != s.charAt(j)){
                    dp[i][j] = false;
                }else{
                    if(j-i<=2 && j-i>=0){
                        dp[i][j] = true;
                        result++;
                    }else{
                        if( i+1<=j-1 && dp[i+1][j-1]){  
                            dp[i][j] = true;
                            result++;
                        }
                        
                    }
                }
            }
        }
        return result;
    }
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

想进阿里的小菜鸡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值