955 刪列造序 II
阿新 • • 發佈:2020-12-30
技術標籤: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”]
解釋:
刪除第一列後,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:
主要思路:解題彙總連結
(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;
}
};