「这是我参与2022首次更文挑战的第12天,活动详情查看:2022首次更文挑战」
[重复的DNA序列]
DNA序列 由一系列核苷酸组成,缩写为 'A', 'C', 'G' 和 'T'.。
例如,"ACGAATTCCG" 是一个 DNA序列 。 在研究 DNA 时,识别 DNA 中的重复序列非常有用。
给定一个表示 DNA序列 的字符串 s ,返回所有在 DNA 分子中出现不止一次的 长度为 10 的序列(子字符串)。你可以按 任意顺序 返回答案。
示例 1:
输入:s = "AAAAACCCCCAAAAACCCCCCAAAAAGGGTTT"
输出:["AAAAACCCCC","CCCCCAAAAA"]
示例 2:
输入:s = "AAAAAAAAAAAAA"
输出:["AAAAAAAAAA"]
提示:
0 <= s.length <= 105 s[i]=='A'、'C'、'G' or 'T'
解题思路:
- 老生长谈,先判断特殊情况 len(s)<10 返回 []
- 创建一个tmp 字典存放字符串出现的次数
- 循环遍历每个字符,到
len(s) - L + 1
class Solution:
def findRepeatedDnaSequences(self, s: str) -> List[str]:
if len(s) < 10:
return []
tmp = {}
res = []
m, n = 0, 10
while n <= len(s):
tmp.setdefault(s[m:n],0)
tmp[s[m:n]] += 1
if tmp[s[m:n]] == 2:
res.append(s[m:n])
m, n = m+1, n+1
return res
执行结果:
[最长回文子串]
给你一个字符串 s,找到 s 中最长的回文子串。
示例 1:
输入:s = "babad" 输出:"bab" 解释:"aba" 同样是符合题意的答案。 示例 2:
输入:s = "cbbd" 输出:"bb" 示例 3:
输入:s = "a" 输出:"a" 示例 4:
输入:s = "ac" 输出:"a"
提示:
1 <= s.length <= 1000 s 仅由数字和英文字母(大写和/或小写)组成
解题过程:
- 先判断特殊情况
- 使用动态规划的思想来做做这个问题
- 首先设置dp 所有的行列都设置为False
- 设置开始值和最大值 n、m
- 遍历所有size值
- 再次遍历从0~j的所有值,进行判断是否符合条件 符合就设置为True
- 最后获得的 s[n:n + m]就是我们想要的值
class Solution:
def longestPalindrome(self, s: str) -> str:
size = len(s)
if size < 2:
return 1
dp = [[ False for _ in range(size)] for _ in range(size)]
m = 1
n = 0
for i in range(size):
dp[i][i] = True
for j in range(1, size):
for i in range(0, j):
if s[i] == s[j]:
if j - i < 3:
dp[i][j] = True
else:
dp[i][j] = dp[i + 1][j - 1]
else:
dp[i][j] = False
if dp[i][j]:
cur_len = j - i + 1
if cur_len > m:
m = cur_len
n = i
return s[n:n + m]
执行结果: