代码随想录算法训练营第57天|● 647. 回文子串 ● 516.最长回文子序列 ● 动态规划总结篇

发布时间:2024年01月06日

647. 回文子串

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

示例 1:
输入:s = “abc”
输出:3
解释:三个回文子串: “a”, “b”, “c”
示例 2:
输入:s = “aaa”
输出:6
解释:6个回文子串: “a”, “a”, “a”, “aa”, “aa”, “aaa”

提示:

  • 1 <= s.length <= 1000
  • s 由小写英文字母组成
    思路
  • 遍历顺序
    • dp[i + 1][j - 1] 在 dp[i][j]的左下角
    • 所以一定要从下到上,从左到右遍历,这样保证dp[i + 1][j - 1]都是经过计算的。

代码

package __DP

import "fmt"

func countSubstrings(s string) int {
   n := len(s)
   /*
      dp[i][j] 表示 s[i:j]是回文串
   */
   dp := make([][]bool, n)
   for i := 0; i < n; i++ {
      dp[i] = make([]bool, n)
      dp[i][i] = true
   }
   res := 0
   for i := n - 1; i >= 0; i-- {
      for j := i; j < n; j++ {
         if s[i] == s[j] {
            if i == j || j-1 == i {
               dp[i][j] = true
            } else if j-1 >= 0 {
               dp[i][j] = dp[i+1][j-1]
            }

         }
         if dp[i][j] {
            res++
         }
      }
   }
   fmt.Println(dp)

   return res
}

516. 最长回文子序列

中等
相关标签
相关企业
给你一个字符串 s ,找出其中最长的回文子序列,并返回该序列的长度。
子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列。

示例 1:
输入:s = “bbbab”
输出:4
解释:一个可能的最长回文子序列为 “bbbb” 。
示例 2:
输入:s = “cbbd”
输出:2
解释:一个可能的最长回文子序列为 “bb” 。

提示:

  • 1 <= s.length <= 1000
  • s 仅由小写英文字母组成

代码

func longestPalindromeSubseq(s string) int {
        size := len(s)
        max := func(a, b int) int {if a > b {return a
                }return b
        }
        dp := make([][]int, size)for i := 0; i < size; i++ {
                dp[i] = make([]int, size)
                dp[i][i] = 1}for i := size - 1; i >= 0; i-- {for j := i + 1; j < size; j++ {if s[i] == s[j] {
                                dp[i][j] = dp[i+1][j-1] + 2} else {
                                dp[i][j] = max(dp[i][j-1], dp[i+1][j])}}}return dp[0][size-1]}
文章来源:https://blog.csdn.net/qq_41735944/article/details/135431977
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。