647. 回文子串
没接触过有点难想,题解思路比较直观。
动态规划写法:
class Solution:
def countSubstrings(self, s: str) -> int:
n = len(s)
dp = [[False] * n for _ in range(n)]
count = 0
for i in range(n):
dp[i][i] = True
count += 1
for i in range(n - 1):
if s[i] == s[i + 1]:
dp[i][i + 1] = True
count += 1
for length in range(3, n + 1):
for start in range(n - length + 1):
end = start + length - 1
if s[start] == s[end] and dp[start + 1][end - 1]:
dp[start][end] = True
count += 1
return count
双指针:
class Solution:
def countSubstrings(self, s: str) -> int:
def count_palindromes_around_center(left: int, right: int) -> int:
count = 0
while left >= 0 and right < len(s) and s[left] == s[right]:
left -= 1
right += 1
count += 1
return count
total_palindromes = 0
for i in range(len(s)):
total_palindromes += count_palindromes_around_center(i, i)
total_palindromes += count_palindromes_around_center(i, i + 1)
return total_palindromes
516. 最长回文子序列
class Solution:
def longestPalindromeSubseq(self, s: str) -> int:
n = len(s)
dp = [[0] * n for _ in range(n)]
for i in range(n):
dp[i][i] = 1
for length in range(2, n + 1):
for start in range(n - length + 1):
end = start + length - 1
if s[start] == s[end]:
dp[start][end] = dp[start + 1][end - 1] + 2
else:
dp[start][end] = max(dp[start + 1][end], dp[start][end - 1])
return dp[0][n-1]
总结:
动规还是需要大量经验的...看新题只能说有概率做出来。