zoukankan      html  css  js  c++  java
  • [Swift]LeetCode187. 重复的DNA序列 | Repeated DNA Sequences

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
    ➤微信公众号:山青咏芝(shanqingyongzhi)
    ➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/
    ➤GitHub地址:https://github.com/strengthen/LeetCode
    ➤原文地址:https://www.cnblogs.com/strengthen/p/10176686.html 
    ➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
    ➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

    All DNA is composed of a series of nucleotides abbreviated as A, C, G, and T, for example: "ACGAATTCCG". When studying DNA, it is sometimes useful to identify repeated sequences within the DNA.

    Write a function to find all the 10-letter-long sequences (substrings) that occur more than once in a DNA molecule.

    Example:

    Input: s = "AAAAACCCCCAAAAACCCCCCAAAAAGGGTTT"
    
    Output: ["AAAAACCCCC", "CCCCCAAAAA"]

    所有 DNA 由一系列缩写为 A,C,G 和 T 的核苷酸组成,例如:“ACGAATTCCG”。在研究 DNA 时,识别 DNA 中的重复序列有时会对研究非常有帮助。

    编写一个函数来查找 DNA 分子中所有出现超多一次的10个字母长的序列(子串)。

    示例:

    输入: s = "AAAAACCCCCAAAAACCCCCCAAAAAGGGTTT"
    
    输出: ["AAAAACCCCC", "CCCCCAAAAA"]

    84ms
     1 class Solution {
     2     func findRepeatedDnaSequences(_ s: String) -> [String] {
     3         guard s.count >= 10 else {
     4             return []
     5         }
     6         var characters = Array(s)
     7         var result = Set<String>()
     8         var dic = [Int : Int]()
     9         var map: [Character : Int] = ["A" : 0, "C" : 1, "G" : 2, "T" : 3]
    10         var cur = 0, i = 0
    11         while i < 9 {
    12             let num = map[characters[i]]!
    13             cur = cur << 2 | (num & 3)
    14             i += 1
    15         }
    16         let count = s.count
    17         while i < count {
    18             let num = map[characters[i]]!
    19             cur = ((cur & 0x3ffff) << 2) | (num & 3)
    20             i += 1
    21             if let _ = dic[cur] {
    22                 let startIndex = s.index(s.startIndex, offsetBy: i - 10)
    23                 let endIndex = s.index(s.startIndex, offsetBy: i)
    24                 result.insert(String(s[startIndex..<endIndex]))
    25             } else {
    26                 dic[cur] = 1
    27             }
    28         }
    29         
    30         return Array(result)
    31         
    32     }
    33     
    34 }

    92ms

     1 class Solution {
     2     func findRepeatedDnaSequences(_ s: String) -> [String] {
     3 
     4         guard s.count >= 10 else { return [] }
     5       
     6         var m = [Int: Int]()
     7         var res = [String]()
     8          var charDict: [Character: Int] = ["A": 0, "C" : 1, "G" : 2, "T" : 3]
     9         var base = 256*256*4 //pow(4, 9) 
    10         var chars = Array(s)
    11         var num = 0
    12         for i in 0..<9 {
    13             num *= 4
    14             num += (charDict[chars[i]] ?? 0 )
    15         }
    16         for i in 9..<chars.count {
    17             num %= base
    18             num *= 4
    19             num += (charDict[chars[i]] ?? 0 )
    20         
    21             m[num, default:0] += 1
    22             if m[num, default:0] == 2 {
    23                 res.append(String(chars[i-9...i]))
    24             }
    25         }
    26         return res
    27     }
    28 }
    29 
    30 extension String {
    31     func substring(_ i: Int, _ len: Int) -> String {
    32         var startInd = index(startIndex, offsetBy: i)
    33         var endInd = index(startIndex, offsetBy: i+len)
    34         return String(self[startInd..<endInd])
    35     }
    36 }

    316ms

     1 class Solution {
     2     func findRepeatedDnaSequences(_ s: String) -> [String] {
     3         guard s.count >= 10 else { return [] }
     4         let chars = Array(s)
     5 
     6         var (seen, repeated) = (Set<String>(), Set<String>())
     7 
     8         for i in 0 ..< (chars.count - 9) {
     9             let cur = String(chars[i ... (i + 9)])
    10             if !seen.insert(cur).inserted {
    11                 repeated.insert(cur)
    12             }
    13         }
    14 
    15         return Array(repeated)
    16     }
    17 }

    412ms

     1 class Solution {
     2     func findRepeatedDnaSequences(_ s: String) -> [String] {
     3         let array = Array(s)
     4         var map: Dictionary<String, Int> = [:]
     5         var result: [String] = []
     6         
     7         if (array.count <= 10) {
     8             return []
     9         }
    10         
    11         for i in 0 ..< array.count - 9 {
    12             let str = String(array[i ..< i + 10])
    13             
    14             if let count = map[str] {
    15                 if (count == 1) {
    16                     result.append(str)
    17                 }
    18                 map[str] = count + 1
    19             } else {
    20                 map[str] = 1
    21             }
    22         }
    23         
    24         return result
    25     }
    26 }

    432ms

     1 class Solution {
     2     func findRepeatedDnaSequences(_ s: String) -> [String] {
     3         let len = s.count
     4         if len <= 10 {
     5             return []
     6         }
     7         var sArr = s.map { $0 }
     8         var set = Set<String>()
     9         var res = [String]()
    10         var temp: String
    11         for i in 0 ... len - 10 {
    12             temp = String(sArr[i ..< i + 10])
    13             if set.contains(temp) {
    14                 if !res.contains(temp) {
    15                     res.append(temp)
    16                 }
    17             } else {
    18                 set.insert(temp)
    19             }
    20         }
    21         
    22         return res
    23     }
    24 }
  • 相关阅读:
    排序算法对比,步骤,改进,java代码实现
    OracleJDK与OpenJDK的区别和联系
    C++函数中那些不可以被声明为虚函数的函数
    编码实现环状单向链表(尾指针直接指向头指针,中间没有空节点),去除连续的重复元素的操作。
    大华2014校园招聘面试题链式存储串的连接操作
    线性表可用顺序表或链表存储的优缺点
    豆瓣面试题strstr)
    百度2014校园招聘消除嵌套的括号
    Wireshark基本介绍和学习TCP三次握手(转载)
    据说是淘宝面试题“给定一个数组将大于0的放在最右边,等于0的放在中间,大于0的放在最左边”
  • 原文地址:https://www.cnblogs.com/strengthen/p/10176686.html
Copyright © 2011-2022 走看看