[LeetCode]647. 回文子串(DP)

题目

给定一个字符串,你的任务是计算这个字符串中有多少个回文子串。

具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被计为是不同的子串。

示例 1:

输入: "abc"
输出: 3
解释: 三个回文子串: "a", "b", "c".
示例 2:

输入: "aaa"
输出: 6
说明: 6个回文子串: "a", "a", "a", "aa", "aa", "aaa".
注意:

输入的字符串长度不会超过1000。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/palindromic-substrings
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解

状态:
boolean dp[i][j]表示s[i to j] 是否是回文串。

状态转移方程:

dp[i][j]=dp[i+1][j-1],s.charAt[i]==s.charAt[j]
dp[i][j]=true,s.charAt[i]==s.charAt[j] && j<=i+2
dp[i][j]=false,s.charAt[i]!=s.charAt[j]

关键,由于dp[i][j]的计算依赖dp[i+1][j-1],所以外层i遍历为从后向前,内层j遍历为从i向后。

代码

class Solution {
    public int countSubstrings(String s) {
        int len = s.length();
        boolean[][] dp = new boolean[len][len];
        int cnt = 0;

        for (int i = len - 1; i >= 0; --i) {
            for (int j = i; j < len; ++j) {
                if (s.charAt(i) == s.charAt(j) && (j <= i + 2 || dp[i + 1][j - 1])) {
                    dp[i][j] = true;
                    cnt++;
                }
            }
        }

        return cnt;
    }
}

原文地址:https://www.cnblogs.com/coding-gaga/p/12294789.html

时间: 2024-11-09 01:39:38

[LeetCode]647. 回文子串(DP)的相关文章

LeetCode 647. 回文子串(Palindromic Substrings)

647. 回文子串 647. Palindromic Substrings 题目描述 给定一个字符串,你的任务是计算这个字符串中有多少个回文子串. 具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被计为是不同的子串. LeetCode647. Palindromic Substrings中等 示例 1: 输入: "abc" 输出: 3 解释: 3 个回文子串: "a", "b", "c". 示例 2: 输入: &

[LeetCode] 647. 回文子串 ☆☆☆(最长子串、动态规划、中心扩展算法)

描述 给定一个字符串,你的任务是计算这个字符串中有多少个回文子串. 具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被计为是不同的子串. 示例 1: 输入: "abc"输出: 3解释: 三个回文子串: "a", "b", "c".示例 2: 输入: "aaa"输出: 6说明: 6个回文子串: "a", "a", "a", "

Leetcode之动态规划(DP)专题-647. 回文子串(Palindromic Substrings)

给定一个字符串,你的任务是计算这个字符串中有多少个回文子串. 具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被计为是不同的子串. 示例 1: 输入: "abc" 输出: 3 解释: 三个回文子串: "a", "b", "c". 示例 2: 输入: "aaa" 输出: 6 说明: 6个回文子串: "a", "a", "a", &quo

LeetCode最长回文子串

题目: 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: "babad"输出: "bab"注意: "aba" 也是一个有效答案. 示例 2: 输入: "cbbd"输出: "bb" 来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/longest-palindromic-substring著作权归领

[C++]LeetCode: 99 Longest Palindromic Substring (最长回文子串)

题目:Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring. 思路:题目要求的s的一个最长回文子串.暴力解决办法就是枚举所有的子串,再对每个子串进行回文判断.进行剪枝,我们考虑可以使用动态规划来避免重复的判

leetcode 5 :Longest Palindromic Substring 找出最长回文子串

题目: Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring. 翻译: 找出字符串s中最长的回文子串,字符串s的最长是1000,假设存在唯一的最长回文子串 法一:直接暴力破解 O(N3)的时间复杂度,运行超

转载:LeetCode:5Longest Palindromic Substring 最长回文子串

本文转自:http://www.cnblogs.com/TenosDoIt/p/3675788.html 题目链接 Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring. 求字符串的最长回文子串 算法1:暴

最长回文子串(Longest Palindromic Substring)-DP问题

问题描述: 给定一个字符串S,找出它的最大的回文子串,你可以假设字符串的最大长度是1000,而且存在唯一的最长回文子串 . 思路分析: 动态规划的思路:dp[i][j] 表示的是 从i 到 j 的字串,是否是回文串. 则根据回文的规则我们可以知道: 如果s[i] == s[j] 那么是否是回文决定于 dp[i+1][ j - 1] 当 s[i] != s[j] 的时候, dp[i][j] 直接就是 false. 动态规划的进行是按照字符串的长度从1 到 n推进的. DP算法实现: 1 packa

LeetCode:5_Longest Palindromic Substring | 最长的回文子串 | Medium

题目: Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring. 解题思路:1.简单思路:暴力破解法,时间复杂度O(n^3),肯定通不过. 2.动态规划法:(一般含“最XX”等优化词义的题意味着都可以动态规划