zoukankan      html  css  js  c++  java
  • [Swift]LeetCode1143. 最长公共子序列 | Longest Common Subsequence

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

    Given two strings text1 and text2, return the length of their longest common subsequence.

    subsequence of a string is a new string generated from the original string with some characters(can be none) deleted without changing the relative order of the remaining characters. (eg, "ace" is a subsequence of "abcde" while "aec" is not). A common subsequence of two strings is a subsequence that is common to both strings.

    If there is no common subsequence, return 0.

    Example 1:

    Input: text1 = "abcde", text2 = "ace" 
    Output: 3  
    Explanation: The longest common subsequence is "ace" and its length is 3.
    

    Example 2:

    Input: text1 = "abc", text2 = "abc"
    Output: 3
    Explanation: The longest common subsequence is "abc" and its length is 3.
    

    Example 3:

    Input: text1 = "abc", text2 = "def"
    Output: 0
    Explanation: There is no such common subsequence, so the result is 0.

    Constraints:

    • 1 <= text1.length <= 1000
    • 1 <= text2.length <= 1000
    • The input strings consist of lowercase English characters only.

    给定两个字符串text1和text2,返回它们最长公共子序列的长度。

    字符串的子序列是从原始字符串生成的新字符串,删除了一些字符(不能为无),而不更改其余字符的相对顺序。(例如,“ace”是“abcde”的子序列,而“aec”不是)。两个字符串的公共子序列是两个字符串的公共子序列。

    如果没有公共子序列,则返回0。

    例1:

    输入:text1=“abcde”,text2=“ace”

    输出:3

    说明:最长的常见子序列是“ace”,其长度为3。

    例2:

    输入:text1=“abc”,text2=“abc”

    输出:3

    说明:最长的常见子序列为“abc”,其长度为3。

    例3:

    输入:text1=“abc”,text2=“def”

    输出:0

    说明:没有这种常见的子序列,所以结果是0。

    限制条件:

    • 1<=text1.长度<=1000
    • 1<=text2.长度<=1000
    • 输入字符串仅由小写英文字符组成。

    76ms

     1 sample 76 ms submission
     2 class Solution {
     3     func longestCommonSubsequence(_ text1: String, _ text2: String) -> Int {
     4         var chars1 = Array(text1)
     5         var chars2 = Array(text2)
     6         var memo = [[Int]](repeating:[Int](repeating: 0, count:chars2.count+1), count: chars1.count+1)
     7         
     8         for i in chars1.indices {
     9             for j in chars2.indices {
    10                 
    11                 if chars1[i] == chars2[j] {
    12                     memo[i+1][j+1] = memo[i][j] + 1
    13                 } else {
    14                     memo[i+1][j+1] = max(memo[i][j+1], memo[i+1][j])
    15                 }
    16             }
    17         }
    18         return memo[chars1.count][chars2.count]
    19     }
    20 }

    76ms
     1 class Solution {
     2     func longestCommonSubsequence(_ text1: String, _ text2: String) -> Int {
     3         var outer = Array(text1) // outer
     4         var inner = Array(text2) // inner
     5         var T = Array(repeating: Array(repeating: 0, count: outer.count+1), count: inner.count+1)
     6         
     7         for j in 1...inner.count {
     8             for i in 1...outer.count {
     9                 if inner[j-1] == outer[i-1] {
    10                     T[j][i] = T[j-1][i-1]+1
    11                 } else {
    12                     T[j][i] = max(T[j][i-1], T[j-1][i])
    13                 }
    14             }
    15         }
    16         return T[inner.count][outer.count]
    17     }
    18 }

    84ms

     1 class Solution {
     2     func longestCommonSubsequence(_ text1: String, _ text2: String) -> Int {
     3         return solu(text1: text1, text2: text2)
     4     }
     5     
     6     private func solu(text1: String, text2: String) -> Int {
     7         var dp: [[Int]] = Array(repeating: Array(repeating: 0, count: text2.count + 1), count: text1.count + 1)
     8         
     9         let t1 = text1.map { String($0) }
    10         let t2 = text2.map { String($0) }
    11         for i in 0 ..< t1.count {
    12             for j in 0 ..< t2.count {
    13                 if t1[i] == t2[j] {
    14                     dp[i + 1][j + 1] = 1 + dp[i][j]                    
    15                 } else {
    16                     dp[i + 1][j + 1] = max(dp[i][j + 1], dp[i + 1][j])
    17                 }
    18             }
    19         }
    20         return dp[text1.count][text2.count]
    21     }
    22     
    23     private func find(text1: String, text2: String, dp: inout [String: Int]) -> Int {
    24         guard text1 != text2 else { 
    25             return text1.count
    26         }
    27         guard text1.count > 0 && text2.count > 0 else { return 0 }
    28         
    29         let key = text1 + "|" + text2
    30         
    31         if let cache = dp[key] {
    32             return cache
    33         }
    34         
    35         var result = 0
    36         for i in 0 ..< text1.count {
    37             for j in 0 ..< text2.count {
    38                 var t1 = text1
    39                 var t2 = text2
    40                 
    41                 let i1 = text1.index(text1.startIndex, offsetBy: i)
    42                 t1.remove(at: i1)
    43                 
    44                 let j1 = text2.index(text2.startIndex, offsetBy: j)
    45                 t2.remove(at: j1)
    46                 
    47                 result = max(
    48                     find(text1: text1, text2: t2, dp: &dp), 
    49                     find(text1: t1, text2: text2, dp: &dp), 
    50                     result
    51                 )
    52             }
    53         }
    54         dp[key] = result
    55         return result
    56     }
    57 }

    88ms

     1 class Solution {
     2     func longestCommonSubsequence(_ text1: String, _ text2: String) -> Int {
     3         var dp = [[Int]](repeating: [Int](repeating: 0, count: text2.count + 1), count: text1.count + 1)
     4         let text1 = Array(text1)
     5         let text2 = Array(text2)
     6         for i in 1..<text1.count + 1 {
     7             for j in 1..<text2.count + 1 {
     8                 if text1[i-1] == text2[j-1] {
     9                     dp[i][j] = 1 + dp[i-1][j-1]
    10                 } else {
    11                     dp[i][j] = max(dp[i-1][j], dp[i][j-1])
    12                 }
    13             }
    14         }
    15         return dp.last!.last!
    16     }
    17 }

    Runtime: 92 ms

    Memory Usage: 26.6 MB
     1 class Solution {
     2     func longestCommonSubsequence(_ text1: String, _ text2: String) -> Int {
     3         let m:Int = text1.count
     4         let n:Int = text2.count
     5         let arr1:[Character] = Array(text1)
     6         let arr2:[Character] = Array(text2)
     7         var dp:[[Int]] = [[Int]](repeating:[Int](repeating:0,count:n + 1),count:m + 1)
     8         for i in 1...m
     9         {
    10             for j in 1...n
    11             {
    12                 if arr1[i - 1] == arr2[j - 1]
    13                 {
    14                     dp[i][j] = dp[i - 1][j - 1] + 1
    15                 }
    16                 else
    17                 {
    18                     dp[i][j] = max(dp[i - 1][j], dp[i][j - 1])
    19                 }
    20             }
    21         }
    22         return dp[m][n]
    23     }
    24 }

      

  • 相关阅读:
    JavaScript实现类的private、protected、public、static以及继承
    OSS网页上传和断点续传(STSToken篇)
    OSS网页上传和断点续传(OSS配置篇)
    Linq sum()时遇到NULL
    SQLSERVER事务日志已满 the transaction log for database 'xx' is full
    笔记本高分辨软件兼容问题,字体太小或模糊
    H5上传图片之canvas
    An error occurred while updating the entries. See the inner exception for details.
    无限级结构SQL查询所有的下级和所有的上级
    SQLserver 进程被死锁问题解决
  • 原文地址:https://www.cnblogs.com/strengthen/p/11297774.html
Copyright © 2011-2022 走看看