LeetCode:回文子串个数(动态规划)
创始人
2024-05-29 20:24:24

文章目录

    • 一、题目
    • 二、算法思路
    • 三、代码实现
    • 四、复杂度分析

一、题目

给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目。具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。
回文字符串 是正着读和倒过来读一样的字符串。
子字符串 是字符串中的由连续字符组成的一个序列。

在这里插入图片描述
https://leetcode.cn/problems/palindromic-substrings/description/

二、算法思路

本题和 最长回文子串(动态规划)类似,使用动态规划方法解决。

1、定义状态:dp[i][j]dp[i][j]dp[i][j] 表示区间 [i,j][i,j][i,j] 是否为回文子串,如果是,dp[i][j]=truedp[i][j]=truedp[i][j]=true,否则为 falsefalsefalse。
2、初始化状态:单个字符是回文子串,dp[i][i]=truedp[i][i]=truedp[i][i]=true。
3、状态转移:枚举区间长度,从小到大计算 dp[i][j]dp[i][j]dp[i][j] 的值,具体的转移方程为:

dp[i][j] = true,                            i == js[i] == s[j],                    j = i + 1s[i] == s[j] && dp[i+1][j-1],    j > i + 1

回文子串的长度可以是 1 或 2,因此先将所有长度为 1 或 2 的子串作为回文子串进行初始化。

然后,从长度为 3 开始枚举所有可能的回文子串,通过状态转移方程dp[i][j] = (s.charAt(i) == s.charAt(j) && dp[i+1][j-1]) 计算出 dp[i][j] 的值。

最后统计回文子串的个数。

三、代码实现

class Solution {public int countSubstrings(String s) {int n = s.length();int ans = 0;boolean[][] dp = new boolean[n][n];// 枚举回文子串的长度,从 1 到 nfor (int len = 1; len <= n; len++) {// 枚举回文子串的起始位置 i,结束位置 jfor (int i = 0; i < n; i++) {int j = i + len - 1;    //回文子串右边界位置if (j >= n) {   //右边界位置超过字符串长度跳出循环break;}if (len == 1) {dp[i][j] = true;} else if (len == 2) {dp[i][j] = (s.charAt(i) == s.charAt(j));} else {dp[i][j] = (s.charAt(i) == s.charAt(j) && dp[i+1][j-1]);}if (dp[i][j]) { //统计回文子串个数ans++;}}}return ans;}
}

四、复杂度分析

  • 时间复杂度为 O(n2)O(n^2)O(n2)
  • 空间复杂度: O(n2)O(n^2)O(n2)

相关内容

热门资讯

苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...