当前位置:实例文章 » 其他实例» [文章]代码随想录刷题第57天|Leetcode647回文子串、Leetcode516最长回文子序列

代码随想录刷题第57天|Leetcode647回文子串、Leetcode516最长回文子序列

发布人:shili8 发布时间:2024-12-27 05:46 阅读次数:0

**代码随想录刷题第57天**

今天我们来解决两个经典的回文问题:LeetCode647 回文子串和 LeetCode516 最长回文子序列。

### LeetCode647 回文子串给定一个字符串 `s`,返回所有可能的回文子串。可以重复选择 `s` 的字符。

**示例1:**

* 输入:`"abcba"`
* 输出:`["abcba", "cab", "bca", "a", "ab", "ac", "bac"]`

**示例2:**

* 输入:`"abcd"`
* 输出:`["a", "b", "c", "d"]`

#### 解决方案我们可以使用回文中心扩展法来解决这个问题。回文中心是指回文子串的中间部分。

class Solution:
 def findSubstrings(self, s: str) -> List[str]:
 n = len(s)
 # 回文中心为单个字符时,回文子串为该字符本身 for i in range(n):
 yield s[i:i+1]
 # 回文中心为两个字符时,回文子串为这两个字符的排列 for i in range(n -1):
 if s[i] == s[i +1]:
 yield s[i:i+2]
 # 回文中心为三个或以上字符时,回文子串为这些字符的排列 for length in range(3, n +1):
 for i in range(n - length +1):
 if s[i] == s[i + length -1]:
 yield s[i:i+length]


### LeetCode516 最长回文子序列给定一个字符串 `s`,返回最长的回文子序列。

**示例1:**

* 输入:`"abba"`
* 输出:`3`

**示例2:**

* 输入:`"abcba"`
* 输出:`4`

#### 解决方案我们可以使用动态规划来解决这个问题。最长回文子序列的长度等于两个相同字符之间的最大距离。

class Solution:
 def longestPalindromeSubseq(self, s: str) -> int:
 n = len(s)
 # 动态规划表,dp[i][j]表示s[i:j+1]的最长回文子序列长度 dp = [[0] * (n +1) for _ in range(n +1)]
 # 初始化动态规划表 for i in range(n):
 dp[i][i] =1 # 计算dp[i][j]
 for length in range(2, n +1):
 for i in range(n - length +1):
 j = i + length -1 # 如果s[i:j+1]是回文子串,则直接返回长度 if s[i] == s[j]:
 dp[i][j] = length # 否则,计算dp[i][j]为两种情况的最大值 else:
 dp[i][j] = max(dp[i +1][j], dp[i][j -1])
 return dp[0][n -1]


以上就是今天我们解决的两个回文问题。希望这些示例和代码能够帮助你更好地理解这些概念。

其他信息

其他资源

Top