更多精彩內(nèi)容,請關(guān)注【力扣簡單題】。
題目
難度:★★☆☆☆
類型:字符串
給定由 N 個小寫字母字符串組成的數(shù)組 A,其中每個字符串長度相等。
選取一個刪除索引序列,對于 A 中的每個字符串,刪除對應(yīng)每個索引處的字符。 所余下的字符串行從上往下讀形成列。
比如,有 A = ["abcdef", "uvwxyz"],刪除索引序列 {0, 2, 3},刪除后 A 為["bef", "vyz"], A 的列分別為["b","v"], ["e","y"], ["f","z"]。(形式上,第 n 列為 [A[0][n], A[1][n], ..., A[A.length-1][n]])。
假設(shè),我們選擇了一組刪除索引 D,那么在執(zhí)行刪除操作之后,A 中所剩余的每一列都必須是 非降序 排列的,然后請你返回 D.length 的最小可能值。
提示
1 <= A.length <= 100
1 <= A[i].length <= 1000
示例
示例 1
輸入:["cba", "daf", "ghi"]
輸出:1
解釋:
當(dāng)選擇 D = {1},刪除后 A 的列為:["c","d","g"] 和 ["a","f","i"],均為非降序排列。
若選擇 D = {},那么 A 的列 ["b","a","h"] 就不是非降序排列了。
示例 2
輸入:["a", "b"]
輸出:0
解釋:D = {}
示例 3
輸入:["zyx", "wvu", "tsr"]
輸出:3
解釋:D = {0, 1, 2}
解答
這道題雖然題目看起來龐大,但是想表達(dá)的道理很簡單:
以例子1為例,有這樣一個表:
| 單詞 | 第一列 | 第二列 | 第三列 |
|---|---|---|---|
| 單詞1 | c | b | a |
| 單詞2 | d | a | f |
| 單詞3 | g | h | i |
要刪除表中一些列,這里刪除了第二列,獲得表:
| 單詞 | 第一列 | 第三列 |
|---|---|---|
| 單詞1 | c | a |
| 單詞2 | d | f |
| 單詞3 | g | i |
這樣每一列都是非降序了。
可以觀察到,要刪除不是非降序的列即可實現(xiàn)任務(wù),通過統(tǒng)計表中不是非降序的列的總數(shù)即可。
因此我們可以逐列比較,比較當(dāng)前列排序前后是否一致,統(tǒng)計所有不一致的情況,即為所求。
class Solution:
def minDeletionSize(self, A):
"""
:type A: List[str]
:rtype: int
"""
res = 0
for i in zip(*A):
if list(i) != sorted(i):
res += 1
return res
緊湊寫法:
class Solution:
def minDeletionSize(self, A):
"""
:type A: List[str]
:rtype: int
"""
return sum([list(c) != sorted(c) for c in zip(*A)])
如有疑問或建議,歡迎評論區(qū)留言~