给定一个字符串,你的任务是计算这个字符串中有多少个回文子串。
具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。
示例 1:
示例 2:
提示:输入的字符串长度不会超过 1000 。
对于每个可能的“中心点”,向两边扩展,检查以该中心为对称轴的子串是否为回文。
- def countSubstrings(s: str) -> int:
- def expandAroundCenter(left: int, right: int) -> int:
- count = 0
- while left >= 0 and right < len(s) and s[left] == s[right]:
- count += 1
- left -= 1
- right += 1
- return count
-
- result = 0
- for i in range(len(s)):
- # 奇数长度的回文子串
- result += expandAroundCenter(i, i)
- # 偶数长度的回文子串
- result += expandAroundCenter(i, i + 1)
-
- return result
-
- # 测试代码
- print(countSubstrings("abc")) # 应该输出 3
- print(countSubstrings("aaa")) # 应该输出 6
给定一个字符串 s ,找到其中最长的回文子序列,并返回该序列的长度。可以假设 s 的最大长度为 1000 。
示例 1: 输入: "bbbab" 输出: 4 一个可能的最长回文子序列为 "bbbb"。
示例 2: 输入:"cbbd" 输出: 2 一个可能的最长回文子序列为 "bb"。
提示:
dp,其中 dp[i][j] 表示字符串 s 中第 i 到第 j 个字符组成的子串中,最长回文子序列的长度。dp[i][i] = 1。s[i] == s[j],那么 dp[i][j] = dp[i + 1][j - 1] + 2。s[i] != s[j],那么 dp[i][j] = max(dp[i + 1][j], dp[i][j - 1])。dp 数组,确保每次计算 dp[i][j] 时 dp[i + 1][j] 和 dp[i][j - 1] 已知。- def longestPalindromeSubseq(s: str) -> int:
- n = len(s)
- dp = [[0] * n for _ in range(n)]
-
- for i in range(n - 1, -1, -1):
- dp[i][i] = 1
- for j in range(i + 1, n):
- if s[i] == s[j]:
- dp[i][j] = dp[i + 1][j - 1] + 2
- else:
- dp[i][j] = max(dp[i + 1][j], dp[i][j - 1])
-
- return dp[0][n - 1]
-
- # 测试代码
- print(longestPalindromeSubseq("bbbab")) # 应该输出 4
- print(longestPalindromeSubseq("cbbd")) # 应该输出 2