java数据结构与算法刷题-----LeetCode647. 回文子串

java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846

在这里插入图片描述

解题思路
  1. 直接使用中心扩展法即可。
  2. 对于其它方法,LeetCode第5题都有涉及
🏆LeetCode5:最长回文子串https://blog.csdn.net/grd_java/article/details/124666706
中心扩展法
  1. 对于不同的回文串,它的中心可能是1个字符,或者2个字符
  1. 例如abccba这样的字符串是回文串,以两个字符cc为中心
  2. abcccba这样的是以一个字符c为中心的回文串
  1. 所以我们可以从头到尾遍历字符串。然后每一次都考虑,两个字符为中心,和一个字符为中心,这两种情况来构建回文串。
  2. 确定中心后,只需要使用贪心的思想,不断扩展的比较两边。当前两边只要相等,那么整个字符串就是回文串。
  1. 例如abcccba。我们先拿到了c
  2. 然后向两边扩展比较,abcccba。我们发现两边相等。那么ccc就是一个回文串
  3. 再次向两边扩展abcccba,两边再次相等,那么bcccb就是一个回文串
  4. 再次向两边扩展abcccba两边再次相等,那么abcccba就是一个回文串
代码

在这里插入图片描述

class Solution {
    /**
        中心拓展回文串法,时间复杂度O(n^2).空间复杂度O(1)
        我们要统计所有回文串的个数,
     */
    public int countSubstrings(String s) {
        int n = s.length(), ans = 0;//n为字符串长度,ans保存有几种回文串
        char c[] = s.toCharArray();//转换为char数组
        //中心扩展法经典步骤
        for(int i = 0; i < n;i++){//从左到右依次选择字符作为中心
            //找到以i位置字符为中间的回文串。abcccba以c为中心的回文串
            ans += expandAroundCenter(c,i,i);//处理1个字符作为中心的回文串
            //找到以i和i+1位置为中心的回文字符串。例如abccba这样的字符串是回文串,cc为中心
            ans += expandAroundCenter(c,i,i+1);//处理2个字符作为中心的回文串
        }
        return ans;
    }
    //找到回文串的核心逻辑,不断进行两边的扩展比较。
    private int expandAroundCenter(char[] c,int i, int j){
        int count = 0;//回文串个数
        while(i >= 0 && j < c.length && c[i]==c[j]){//如果满足回文串
            i--;j++;//继续判断
            count++;//每个回文串都记录
        }
        return count;
    }
}
  • 12
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

殷丿grd_志鹏

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

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

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

打赏作者

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

抵扣说明:

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

余额充值