1. 程式人生 > 其它 >955 刪列造序 II

955 刪列造序 II

技術標籤:LeetCode

題目描述:
給定由 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 <= A.length <= 100

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

方法1:
主要思路:解題彙總連結
(1)對於出現A[j][i]<A[j-1][i]的列 i,是一定要刪除的i;
(2)若當前列中不存在A[j][i]<A[j-1][i],則需要進一步判讀是否有A[j][i]==A[j-1][i],對於出現相等的情形,說明需要進一步的判斷這些出現相等的位置所在的行,而對於A[j][i]>A[j-1][i]的情形,是已經滿足要求的行,標識出來,後續不需要再次判讀;

class Solution {
public:
    int minDeletionSize(vector<string>
& A) { vector<bool>sign(A.size(),false);//標識出已經滿足要求的行 int res=0; for(int i=0;i<A[0].size();++i){//對各個列進行判斷 int j=1; for(;j<A.size();++j){//判斷當前列中各個行之間關係,是否有降序的情形,需要刪除當前列的情形 if(!sign[j]&&A[j][i]<A[j-1][i]){ ++res; break; } } if(j==A.size()){//說明當前列不需要刪除,但需要標識出相等的情形,便於後面的判斷 int has_equele=false;//判讀當前列中是否有需要進一步判斷的情形 for(j=1;j<A.size();++j){ if(A[j][i]>A[j-1][i]){//標識出後續不需要判斷的情形 sign[j]=true; } else{//標識出需要判斷的情形 has_equele=true; } } if(!has_equele){//說明沒有需要進一步判斷的 break; } } } return res; } };