[Swift]LeetCode955. 刪列造序 II | Delete Columns to Make Sorted II

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公衆號:山青詠芝(shanqingyongzhi)
➤博客園地址:山青詠芝(https://www.cnblogs.com/strengthen/
➤GitHub地址:https://github.com/strengthen/LeetCode
➤原文地址:http://www.javashuo.com/article/p-qcobjnvq-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 = ["abcdef","uvwxyz"] and deletion indices {0, 2, 3}, then the final array after deletions is ["bef","vyz"].數組

Suppose we chose a set of deletion indices D such that after deletions, the final array has its elements in lexicographic order (A[0] <= A[1] <= A[2] ... <= A[A.length - 1]).微信

Return the minimum possible value of D.length.app

Example 1:函數

Input: ["ca","bb","ac"]
Output: 1 Explanation: After deleting the first column, A = ["a", "b", "c"]. Now A is in lexicographic order (ie. A[0] <= A[1] <= A[2]). We require at least 1 deletion since initially A was not in lexicographic order, so the answer is 1. 

Example 2:ui

Input: ["xc","yb","za"]
Output: 0
Explanation: 
A is already in lexicographic order, so we don't need to delete anything.
Note that the rows of A are not necessarily in lexicographic order:
ie. it is NOT necessarily true that (A[0][0] <= A[0][1] <= ...)

Example 3:spa

Input: ["zyx","wvu","tsr"]
Output: 3 Explanation: We have to delete every column.

Note:code

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

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

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

好比,有 A = ["abcdef", "uvwxyz"],刪除索引序列 {0, 2, 3},刪除後 A 爲["bef", "vyz"]

假設,咱們選擇了一組刪除索引 D,那麼在執行刪除操做以後,最終獲得的數組的元素是按 字典序(A[0] <= A[1] <= A[2] ... <= A[A.length - 1])排列的,而後請你返回 D.length 的最小可能值。

示例 1:

輸入:["ca","bb","ac"]
輸出:1
解釋: 
刪除第一列後,A = ["a", "b", "c"]。
如今 A 中元素是按字典排列的 (即,A[0] <= A[1] <= A[2])。
咱們至少須要進行 1 次刪除,由於最初 A 不是按字典序排列的,因此答案是 1。

示例 2:

輸入:["xc","yb","za"]
輸出:0
解釋:
A 的列已是按字典序排列了,因此咱們不須要刪除任何東西。
注意 A 的行不須要按字典序排列。
也就是說,A[0][0] <= A[0][1] <= ... 不必定成立。

示例 3:

輸入:["zyx","wvu","tsr"]
輸出:3
解釋:
咱們必須刪掉每一列。

提示:

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

72ms
 1 class Solution {
 2     func minDeletionSize(_ A: [String]) -> Int {
 3         var n:Int = A.count
 4         var ss:[String] = [String](repeating:"",count:n)
 5         var ret:Int = 0
 6         outer:
 7         for i in 0..<A[0].count
 8         {
 9             for j in 0..<(n - 1)
10             {
11                 if ss[j] == ss[j+1] && A[j][i] > A[j+1][i]
12                 {
13                     ret += 1
14                     continue outer
15                 }
16             }
17             for j in 0..<n
18             {
19                 ss[j].append(A[j][i])
20             }
21         }
22         
23         return ret                  
24     }
25 }
26     
27 extension String {        
28     //subscript函數能夠檢索數組中的值
29     //直接按照索引方式截取指定索引的字符
30     subscript (_ i: Int) -> Character {
31         //讀取字符
32         get {return self[index(startIndex, offsetBy: i)]}
33         
34     }
35 }

100ms
 1 class Solution {
 2     func minDeletionSize(_ A: [String]) -> Int {
 3         let R = A.count
 4         guard A.count > 1 else {
 5             return 0
 6         }
 7         let C = A[0].count
 8         var del = [Int](repeating: 0, count: C)
 9         var pc = [Int](repeating: 0, count: R)
10         for c in 0 ..< C {
11             var npc = [Int](repeating: 0, count: R)
12             for r in 1 ..< R {
13                 let ic = A[r].index(A[r].startIndex, offsetBy: c)
14                 let v = A[r][ic] < A[r-1][ic] ? 1 : A[r][ic] == A[r-1][ic] ? 0 : -1
15                 npc[r] = pc[r] == -1 ? -1 : v
16                 //print(A[r][ic], A[r-1][ic], v)
17                 if npc[r] > 0 {
18                     del[c] = 1
19                 }                    
20             }
21             //print(pc, npc, del)
22             if del[c] == 0 {
23                 pc = npc
24             }
25         }
26         return del.reduce(0, +)
27     }
28 }
相關文章
相關標籤/搜索