回文字串问题
516. 最长回文子序列
给定一个字符串s 找到其中最长的回文子序列 可以假设s的最大长度为1000 (注意这里的回文子序列不一定是连续的)
n = len(s)
dp = [[0] for _ in range(n)] for _ in range(n)] # dp[i][j] 表示第i个到第j个字符间的子序列的个数(i < j)
for i in range(n):
dp[i][i] = 1
# 对于任意字符串 如果头尾字符相同 那么字符串的最长子序列等于去掉首尾的字符串的最长子序列加上首尾
# 如果首尾字符不同 则最长子序列等于去掉头的字符串的最长子序列和去掉尾的字符串的最长子序列的较大者
for j in range(1, n):
for i in range(j - 1, -1, -1):
if s[i] == s[j]:
dp[i][j] = 2 + dp[i + 1][j - 1]
else:
dp[i][j] = max(dp[i + 1][j], dp[i][j - 1])
return dp[0][n - 1]
5. 最长回文字串
描述:给定一个字符串s 找到s中最长的回文字串(这里的回文串是连续的) 你可以假设s的最大长度为1000
k = len(s)
matrix = [[0] for i in range(k)] for i in range(k)] # matrix[i, j] 表示s[i:j]字串是否是回文串
longestSubStr = ""
logestLen = 0
for j in range(0, k):
for i in range(0, j + 1):
if j - i <= 1: # 当j - i <= 1时 如果s[i] == s[j] 则表示是s[i:j]为回文字串 matrix[i][j] 为true 否则matrix[i][j] = false
if s[i] == s[j]:
matrix[i][j] = 1
if logestLen < j - i + 1:
logestSubStr = s[i:j + 1]
logestLen = j - i + 1
else:
if s[i] == s[j] and matrix[i+1][j-1]: # 当j - i > 1时 则判断s[i] s[j]是否相等以及matrix[i + 1][j - 1]是否为true 即s[i + 1: j + 1]是否是回文串 如果为真 matrix[i][j]=true
matrix[i][j] = 1
if logestLen < j - i + 1:
logestSubStr = s[i: j + 1]
logestLen = j - i + 1
return logestSubStr
647. 回文字串
n = len(s)
if n == 0:
return 0
dp = [1 for i in range(n)]
for i in range(n):
for j in range(i + 1, n):
if s[j] == s[i] and s[i: j + 1] == s[i: j+1][::-1]:
dp[i] += 1
return sum(dp)
34. 在排序数组中查找元素的第一个和最后一个位置
描述:给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
sorted_nums = nums[: : -1]
if target in nums:
start = nums.index(target)
end = len(nums) - sort_nums.index(target) - 1
return [start, end]
else:
return [-1, -*1]