2022跟着leedcode学数据结构--第12天

114 阅读1分钟

「这是我参与2022首次更文挑战的第12天,活动详情查看:2022首次更文挑战

image.png

[重复的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

执行结果:

image.png

[最长回文子串]

给你一个字符串 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]

执行结果:

image.png