[Swift]LeetCode960. 刪列造序 III | Delete Columns to Make Sorted III

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

We are given an array A of N lowercase letter strings, all of the same length.git

Now, we may choose any set of deletion indices, and for each string, we delete all the characters in those indices.github

For example, if we have an array A = ["babca","bbazb"] and deletion indices {0, 1, 4}, then the final array after deletions is ["bc","az"].數組

Suppose we chose a set of deletion indices D such that after deletions, the final array has every element (row) in lexicographic order.微信

For clarity, A[0] is in lexicographic order (ie. A[0][0] <= A[0][1] <= ... <= A[0][A[0].length - 1]), A[1] is in lexicographic order (ie. A[1][0] <= A[1][1] <= ... <= A[1][A[1].length - 1]), and so on.less

Return the minimum possible value of D.length.函數

Example 1:spa

Input: ["babca","bbazb"] Output: 3 Explanation: After deleting columns 0, 1, and 4, the final array is A = ["bc", "az"]. Both these rows are individually in lexicographic order (ie. A[0][0] <= A[0][1] and A[1][0] <= A[1][1]). Note that A[0] > A[1] - the array A isn't necessarily in lexicographic order. 

Example 2:code

Input: ["edcba"] Output: 4 Explanation: If we delete less than 4 columns, the only row won't be lexicographically sorted. 

Example 3:htm

Input: ["ghi","def","abc"] Output: 0 Explanation: All rows are already lexicographically sorted.

Note:

  1. 1 <= A.length <= 100
  2. 1 <= A[i].length <= 100

給定由 N 個小寫字母字符串組成的數組 A,其中每一個字符串長度相等。

選取一個刪除索引序列,對於 A 中的每一個字符串,刪除對應每一個索引處的字符。

好比,有 A = ["babca","bbazb"],刪除索引序列 {0, 1, 4},刪除後 A 爲["bc","az"]

假設,咱們選擇了一組刪除索引 D,那麼在執行刪除操做以後,最終獲得的數組的行中的每一個元素都是按字典序排列的。

清楚起見,A[0] 是按字典序排列的(即,A[0][0] <= A[0][1] <= ... <= A[0][A[0].length - 1]),A[1] 是按字典序排列的(即,A[1][0] <= A[1][1] <= ... <= A[1][A[1].length - 1]),依此類推。

請你返回 D.length 的最小可能值。

示例 1:

輸入:["babca","bbazb"]
輸出:3
解釋:
刪除 0、1 和 4 這三列後,最終獲得的數組是 A = ["bc", "az"]。
這兩行是分別按字典序排列的(即,A[0][0] <= A[0][1] 且 A[1][0] <= A[1][1])。
注意,A[0] > A[1] —— 數組 A 不必定是按字典序排列的。

示例 2:

輸入:["edcba"]
輸出:4
解釋:若是刪除的列少於 4 列,則剩下的行都不會按字典序排列。

示例 3:

輸入:["ghi","def","abc"]
輸出:0
解釋:全部行都已按字典序排列。

提示:

  1. 1 <= A.length <= 100
  2. 1 <= A[i].length <= 100

108ms

 1 class Solution {  2     func minDeletionSize(_ A: [String]) -> Int {  3         let n = A.count  4         if (n == 0) {  5             return 0
 6  }  7         let m = A.first!.count  8         if (m == 0) {  9             return 0
10  } 11         
12         let Chars = A.map{Array<UInt8>($0.utf8)} 13         
14         var compare = Array<Array<Bool>>(repeating: Array<Bool>(repeating: false, count: m), count: m) 15         for i in 0..<m { 16             one: for j in i+1..<m { 17                 for l in 0..<n { 18                     if Chars[l][i] > Chars[l][j] { 19                         continue one 20  } 21  } 22                 compare[i][j] = true
23  } 24  } 25         
26         var f :[Int] = Array<Int>(repeating: 0, count: m) 27         
28         var i = m - 2; 29         while  i >= 0 { 30             var max = 0
31             for j in i+1..<m { 32                 let tempMax = (compare[i][j] ? (1 + f[j]): 0) 33                 if (tempMax > max) { 34                     max = tempMax 35  } 36  } 37             f[i] = max 38             i -= 1
39  } 40         var max = 0
41         for fe in f { 42             if max < fe { 43                 max = fe 44  } 45  } 46         return m - (max + 1) 47  } 48 }

160ms

 1 class Solution {  2     func minDeletionSize(_ A: [String]) -> Int {  3     let count = A[0].count  4     guard count > 1 else { return 0 }  5     
 6     let chars: [[Character]] = A.map { Array($0) }  7     var dp = [Int](repeating: 1, count: count)  8     
 9     for r in 1..<count { 10         var longest = 0
11         
12         next: for l in 0..<r { 13             for row in chars { 14                 if row[l] > row[r] { 15                     continue next 16  } 17  } 18             if dp[l] > longest { 19                 longest = dp[l] 20  } 21  } 22         
23         dp[r] = longest + 1
24  } 25     return count - dp.max()!
26 } 27 }

512ms

 1 class Solution {  2     func minDeletionSize(_ A: [String]) -> Int {  3         var A = A  4         var n:Int = A.count  5         var m:Int = A[0].count  6         var f:[Int] = [Int](repeating:0,count:102)  7         var maxd = -1
 8         for i in 0..<m  9  { 10             f[i] = 1
11             for j in 0..<i 12  { 13                 if smaller(j, i, &A, n) 14  { 15                     f[i] = max(f[i], f[j] + 1) 16  } 17  } 18             maxd = max(maxd, f[i]) 19  } 20         return m - maxd 21  } 22     
23     func smaller(_ i:Int,_ j:Int,_ A:inout [String],_ n:Int) -> Bool 24  { 25         for k in 0..<n 26  { 27             if A[k][i] > A[k][j] 28  { 29                 return false
30  } 31  } 32         return true
33  } 34 } 35 
36 extension String { 37     //subscript函數能夠檢索數組中的值 38     //直接按照索引方式截取指定索引的字符
39     subscript (_ i: Int) -> Character { 40         //讀取字符
41         get {return self[index(startIndex, offsetBy: i)]} 42  } 43 }

1488ms

 1 class Solution {  2     func minDeletionSize(_ A: [String]) -> Int {  3         let count = A[0].count  4     guard count > 1 else { return 0 }  5     
 6     var dp = [Int](repeating: 1, count: count)  7     
 8     for r in 1..<count {  9         var longest = 0
10         
11         next: for l in 0..<r { 12             for row in A { 13                 let chars = Array(row) 14                 if chars[l] > chars[r]{ 15                     continue next 16  } 17  } 18             if dp[l] > longest { 19                 longest = dp[l] 20  } 21  } 22         
23         dp[r] = longest + 1
24  } 25     
26     return count - dp.max()!
27  } 28 }
相關文章
相關標籤/搜索