首页 > 其他分享 >Leetcode 回文子串

Leetcode 回文子串

时间:2024-03-31 20:11:25浏览次数:21  
标签:子串 right 中心 int radius Leetcode 回文

Day 16

学习中心扩展法
class Solution {
    public int countSubstrings(String s) {
        // 从中心扩展,
        int count = 0;
        int n = s.length(); 
        // 字符串长度分奇数和偶数,但回文中心的可能性是确定的
      
        // 枚举所有的回文中心
        for(int i = 0;i<2*n-1;i++){
            // 偶数是中心两个字符,奇数是中心一个字符,但注意这里的i是所有可能回文中心的编号索引
            int l = i/2, r = i/2 + i%2;
            while(l>=0&&r<n){
                if(s.charAt(l--) == s.charAt(r++)){
                    count++;
                }else{
                    break;
                }
            }

        }
        return count;
    }
}
Manacher 算法
class Solution {
    public int countSubstrings(String s) {
        // 从中心扩展,
        int num = s.length();
        StringBuffer t = new StringBuffer("$#");
        for(int i =0;i<num;i++){
            t.append(s.charAt(i));
            t.append('#');
        }
        int n = t.length();
        t.append('!');
        // System.out.println(t);

        int[] f = new int[n];
        int center = 0, right_radius = 0,ans = 0;

        for(int i = 1;i<n;i++){

            // 在现存的回文子串半径内
            if(i<right_radius){
                // 对称点的回文半径是否小于最大半径,若大于,则为到边界的距离,否则为对称点回文半径
                f[i] = Math.min(f[2*center-i],right_radius-i+1);
            }else{
                f[i] = 1;
            }

            // 向外扩展

            while(t.charAt(i+f[i])==t.charAt(i-f[i])){
                // 如果可以往外拓展则增大半径
               f[i]++; 
            }

            if(i+f[i]-1 > right_radius){
                center = i;
                right_radius = center+f[i]-1;
            }
            // 子串数目与回文中心半径的关系:回文半径为r,自己加了#在字符之间
            ans +=f[i]/2;
        }

        return ans;
    }
}

开头和结尾的两个字符一定不相等,循环就可以在这里终止。

标签:子串,right,中心,int,radius,Leetcode,回文
From: https://www.cnblogs.com/xytang-mini-juan/p/18107183

相关文章

  • LeetCode Hot100-哈希-两数之和
    题目描述:给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值target的两个整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。示例1:输入:nums=[2,7,1......
  • LeetCode刷题记录——day9
    https://leetcode.cn/problems/game-of-life/?envType=study-plan-v2&envId=2024-spring-sprint-100先创建一个数组,让它比原数组大一圈,然后将其全设为0,在原数组中每有一个1出现,就将其对应位置的新数组的周围全部加一,最后新数组中对应位置的数字就是其周围有多少个活细胞classSo......
  • LeetCodeHot100 二叉树 94. 二叉树的中序遍历 104. 二叉树的最大深度 101. 对称二
    94.二叉树的中序遍历https://leetcode.cn/problems/binary-tree-inorder-traversal/description/?envType=study-plan-v2&envId=top-100-liked//递归//List<Integer>resList;//publicList<Integer>inorderTraversal(TreeNoderoot){//re......
  • LeetCode 84. 柱状图中最大的矩形
    解题思路单调栈经典题型,这道题我们需要找到heights[i]左边的最近的比heights[i]小的值,找到heights[i]右边的最近的比heights[i]小的值。所以我们想到了单调栈。相关代码classSolution{publicintlargestRectangleArea(int[]heights){intn=h......
  • java数据结构与算法刷题-----LeetCode1091. 二进制矩阵中的最短路径
    java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846文章目录广度优先+双分裂蛇广度优先+双分裂蛇双分裂蛇:是求二维表中从起点到终点的经典思路(也是......
  • java数据结构与算法刷题-----LeetCode95. 不同的二叉搜索树 II
    java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846文章目录分治回溯+记忆化搜索分治回溯+记忆化搜索卡特兰数,例如对于n个进栈元素,有多少种出栈顺序,......
  • 矩阵置零 - LeetCode 热题 18
    大家好!我是曾续缘......
  • 缺失的第一个正数 - LeetCode 热题 17
    大家好!我是曾续缘......
  • Leetcode算法训练日记 | day9
    一、实现strStr函数1.题目Leetcode:第28题给你两个字符串haystack和needle,请你在haystack字符串中找出needle字符串的第一个匹配项的下标(下标从0开始)。如果needle不是haystack的一部分,则返回 -1。示例1:输入:haystack="sadbutsad",needle="sad"输......
  • Leetcode1681-模拟,位运算
    题目链接:https://leetcode.cn/problems/count-the-number-of-consistent-strings/description/32位int构造出现过的字符集合位运算解法:用按位或(|)构造1个32位的数字集合A存用过的字符,此时对目标串构造字符集合B(有B是A子集,A∪B=A),注意运算优先级 题目:给你一个由不同字符......