[Swift]LeetCode115. 不一樣的子序列 | Distinct Subsequences

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公衆號:山青詠芝(shanqingyongzhi)
➤博客園地址:山青詠芝(https://www.cnblogs.com/strengthen/
➤GitHub地址:https://github.com/strengthen/LeetCode
➤原文地址:http://www.javashuo.com/article/p-gteibpvn-me.html 
➤若是連接不是山青詠芝的博客園地址,則多是爬取做者的文章。
➤原文已修改更新!強烈建議點擊原文地址閱讀!支持做者!支持原創!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★html

Given a string S and a string T, count the number of distinct subsequences of S which equals T.git

A subsequence of a string is a new string which is formed from the original string by deleting some (can be none) of the characters without disturbing the relative positions of the remaining characters. (ie, "ACE" is a subsequence of "ABCDE" while "AEC" is not).github

Example 1:微信

Input: S = , T = Explanation:

As shown below, there are 3 ways you can generate "rabbit" from S.
(The caret symbol ^ means the chosen letters)


^^^^ ^^

^^ ^^^^

^^^ ^^^
"rabbbit""rabbit"
Output: 3rabbbitrabbbitrabbbit

Example 2:app

Input: S = , T = Explanation:

As shown below, there are 5 ways you can generate "bag" from S.
(The caret symbol ^ means the chosen letters)


^^ ^

^^    ^

^    ^^

  ^  ^^

    ^^^"babgbag""bag"
Output: 5babgbagbabgbagbabgbagbabgbagbabgbag

給定一個字符串 S 和一個字符串 T,計算在 S 的子序列中 T 出現的個數。spa

一個字符串的一個子序列是指,經過刪除一些(也能夠不刪除)字符且不干擾剩餘字符相對位置所組成的新字符串。(例如,"ACE" 是 "ABCDE" 的一個子序列,而 "AEC" 不是)code

示例 1:orm

輸入: S = , T = 解釋:

以下圖所示, 有 3 種能夠從 S 中獲得 。
(上箭頭符號 ^ 表示選取的字母)


^^^^ ^^

^^ ^^^^

^^^ ^^^
"rabbbit""rabbit"
輸出: 3"rabbit" 的方案rabbbitrabbbitrabbbit

示例 2:htm

輸入: S = , T = 解釋:

以下圖所示, 有 5 種能夠從 S 中獲得 。 
(上箭頭符號 ^ 表示選取的字母)


^^ ^

^^    ^

^    ^^

  ^  ^^

    ^^^"babgbag""bag"
輸出: 5"bag" 的方案babgbagbabgbagbabgbagbabgbagbabgbag

8ms
 1 class Solution {
 2     func numDistinct(_ s: String, _ t: String) -> Int {
 3         let s = Array(s)
 4         let t = Array(t)
 5         var r = Array(repeating:0, count: t.count)
 6         let dict = t.enumerated().reduce(into: [Character: [Int]]()) { $0[$1.1, default:[]].append($1.0) }
 7         for i in 0..<s.count {
 8             guard let indices = dict[s[i]] else { continue }
 9             for j in indices.reversed() {
10                 if j == 0 {
11                     r[0] += 1
12                 } else {
13                     r[j] += r[j-1]
14                 }
15             }
16         }
17         return r[r.count-1]
18     }
19 }

36msblog

 1 class Solution {
 2     func numDistinct(_ s: String, _ t: String) -> Int {
 3         if s.isEmpty {return 0}
 4         let len:Int = s.count
 5         var dp:[Int] = [Int](repeating:1,count:len)
 6         var pre:Int,temp:Int
 7         let arrS:[Character] = Array(s)
 8         let arrT:[Character] = Array(t)
 9         for i in 0..<t.count
10         {
11             pre = dp[0]
12             dp[0] = (i == 0 && arrS[0] == arrT[0]) ? 1 : 0
13             for k in 1..<len
14             {
15                 temp = dp[k]
16                 dp[k] = dp[k - 1] + (arrS[k] == arrT[i] ? pre : 0)
17                 pre = temp
18             }
19         }
20         return dp[len - 1]
21     }
22 }

68ms

 1 class Solution {
 2     func numDistinct(_ s: String, _ t: String) -> Int {
 3         if t.isEmpty { return 1 }
 4         if s.isEmpty || t.isEmpty { return 0 }
 5         var dp = Array(repeating: Array(repeating: 0, count: s.count + 1), count: t.count + 1)
 6         let arrS = Array(s)
 7         let arrT = Array(t)
 8         
 9         dp[0][0] = 1
10         
11         for i in 0...t.count {
12             for j in 1...s.count {
13                 if i == 0 {
14                     dp[0][j] = 1
15                 } else if arrS[j - 1] == arrT[i - 1] {
16                     dp[i][j] = dp[i - 1][j - 1] + dp[i][j - 1]
17                 } else {
18                     dp[i][j] = dp[i][j - 1]
19                 }
20             }
21         }
22 
23         return dp[t.count][s.count]
24     }
25 }

72ms

 1 class Solution {
 2     func numDistinct(_ s: String, _ t: String) -> Int {
 3         return numDistinctDP(s, t)
 4     }
 5     
 6     func numDistinctDP(_ s: String, _ t: String) -> Int {
 7         guard !s.isEmpty else { return 0 }
 8         
 9         var sArray = Array(s)
10         var tArray = Array(t)
11         var matrix = Array(repeating: Array(repeating: 0, count: s.count + 1), 
12                            count: t.count + 1)
13         
14         for i in 0...s.count {
15             matrix[0][i] = 1
16         }
17         
18         for i in 1...t.count {
19             for j in 1...s.count {
20                 
21                 if tArray[i-1] == sArray[j-1] {
22                     matrix[i][j] = matrix[i][j-1] + matrix[i-1][j-1]
23                 } else {
24                     matrix[i][j] = matrix[i][j-1]
25                 }
26                 
27             }
28         }
29         
30         return matrix[t.count][s.count]
31     }
32     
33     func isSubsequenceIteration(_ s: String, _ t: String) -> Bool {
34         guard !s.isEmpty else { return true }
35         guard !t.isEmpty else { return false }
36         
37         let sArray = Array(s)
38         let tArray = Array(t)
39         var current = 0
40         
41         for character in tArray {
42             if sArray[current] == character {
43                 current += 1
44                 if current == sArray.count {
45                     return true
46                 }
47             }
48         }
49         
50         return false
51     }
52 }

96ms

 1 class Solution {
 2     func numDistinct(_ s: String, _ t: String) -> Int {
 3         if s.isEmpty || t.isEmpty {
 4             return 0
 5         }
 6         
 7         let rowCount = t.count
 8         let colCount = s.count
 9         let row = [Int](repeating: 0, count: colCount + 1)
10         var matrix = [[Int]](repeating: row, count: rowCount + 1)
11         matrix[0][0] = 1
12         for i in 1..<colCount+1 {
13             matrix[0][i] = 1
14         }
15         
16         var i = 1
17         for tChar in t {
18             var j = 1
19             for sChar in s {
20                 if sChar == tChar {
21                     matrix[i][j] = matrix[i - 1][j - 1] + matrix[i][j - 1]
22                 } else {
23                     matrix[i][j] = matrix[i][j - 1]
24                 }
25                 j += 1
26             }
27             i += 1
28         }
29         
30         return matrix[rowCount][colCount]
31     }
32 }

164ms

 1 class Solution {
 2     func numDistinct(_ s: String, _ t: String) -> Int {
 3         var mem = [[Int]]()
 4         for index in 0...t.count {
 5             if index == 0 {
 6                 mem.append(Array(repeating: 1, count: s.count+1))
 7             } else {
 8                 mem.append(Array(repeating: 0, count: s.count+1))
 9             }
10         }
11         
12         for (i, tChar) in t.enumerated() {
13             for (j, sChar) in s.enumerated() {
14                 if tChar == sChar {
15                     mem[i+1][j+1] = mem[i][j] + mem[i+1][j]
16                 } else {
17                     mem[i+1][j+1] = mem[i+1][j]
18                 }
19             }
20         }
21         
22         return mem[t.count][s.count]
23     }
24 }

260ms

 1 class Solution {
 2     func numDistinct(_ s: String, _ t: String) -> Int {
 3         
 4         var dict:Dictionary<Character, [Int]> = Dictionary<Character, [Int]>()
 5         
 6         for (index, curChar) in s.enumerated() {
 7             var curIndexes = dict[curChar]
 8             if (curIndexes == nil) {
 9                 curIndexes = []
10                 dict[curChar] = curIndexes
11             }
12             if var curIndexes = curIndexes {
13                 curIndexes.append(index)
14                 dict[curChar] = curIndexes
15             }
16         }
17         
18         var memo:Dictionary<String, Int> = Dictionary<String, Int>()
19         //for each char in s, find t[0] = index
20         //for each char in s find t[1] = index1
21         return findNextIndex(dict, Array(t), 0, 0, &memo)        
22     }
23     
24     func findNextIndex(_ dict:Dictionary<Character, [Int]>, _ t:[Character],_ curIndexChar:Int, _ curIndexString:Int,_ memo:inout Dictionary<String,Int>) -> Int {
25         
26         if (curIndexChar >= t.count) {
27             return 1
28         }
29         
30         let memKey = String(curIndexChar) + String(t) + String(curIndexString)
31         if let precomputedRet =  memo[memKey] {
32             return precomputedRet
33         }
34         
35         var ret = 0
36         
37         let curChar = t[curIndexChar]
38         if let indexes = dict[curChar] {
39             for i in indexes {
40                 if (i >= curIndexString) {
41                     ret += findNextIndex(dict, t, curIndexChar+1, i+1, &memo)
42                 }
43             }
44         }
45         memo[memKey] = ret
46         return ret
47     }
48 }
相關文章
相關標籤/搜索