134、刪列造序
阿新 • • 發佈:2018-12-31
題目描述
給定由 N 個小寫字母字串組成的陣列 A,其中每個字串長度相等。
選取一個刪除索引序列,對於 A 中的每個字串,刪除對應每個索引處的字元。 所餘下的字串行從上往下讀形成列。
比如,有 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]])。
假設,我們選擇了一組刪除索引 D,那麼在執行刪除操作之後,A 中所剩餘的每一列都必須是 非降序 排列的,然後請你返回 D.length 的最小可能值。
示例 1:
輸入:[“cba”, “daf”, “ghi”]
輸出:1
解釋:
當選擇 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}
提示:
1 <= A.length <= 100
1 <= A[i].length <= 1000
題目描述的很複雜,但是讀懂了就不復雜了
class Solution { public int minDeletionSize(String[] A) { int count = 0; for (int i = 0; i < A[0].length(); i++) { for (int j = 0; j < A.length-1; j++) { if(A[j].charAt(i) > A[j+1].charAt(i) ){ count++; break; } } } return count; } }
排名靠前的程式碼
class Solution {
public int minDeletionSize(String[] A) {
char[][] temp = new char[A.length][A[0].length()];
int result = 0;
if(A.length < 2) {
return result;
}
for(int i = 0; i < A.length; i ++) {
char[] row = A[i].toCharArray();
temp[i] = row;
}
ck: for(int i = 0; i < temp[0].length; i ++) {
for(int j = 0; j < temp.length - 1; j ++) {
if(temp[j][i] > temp[j + 1][i]) {
result ++;
continue ck;
}
}
}
return result;
}
}
另一個版本
class Solution {
public int minDeletionSize(String[] A) {
ArrayList<Integer> t = new ArrayList<>();
for (int i = 0; i < A[0].length(); i++) {
char[] arr = new char[A.length];
for (int j = 0; j < A.length; j++) {
arr[j] = A[j].charAt(i);
}
for (int m = 0; m < arr.length - 1; m++) {
if(arr[m] > arr[m+1]) {
t.add(i);
break;
}else{
continue;
}
}
}
return t.size();
}
}