We are given an array A
of N
lowercase letter strings, all of the same length.
Now, we may choose any set of deletion indices, and for each string, we delete all the characters in those indices.
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"]
, and the remaining columns of A
are ["b","v"]
, ["e","y"]
, and ["f","z"]
. (Formally, the c
-th column is [A[0][c], A[1][c], ..., A[A.length-1][c]]
).
Suppose we chose a set of deletion indices D
such that after deletions, each remaining column in A is in non-decreasing sorted order.
Return the minimum possible value of D.length
.
Example 1:
Input: A = ["cba","daf","ghi"]
Output: 1
Explanation:
After choosing D = {1}, each column ["c","d","g"] and ["a","f","i"] are in non-decreasing sorted order.
If we chose D = {}, then a column ["b","a","h"] would not be in non-decreasing sorted order.
Example 2:
Input: A = ["a","b"]
Output: 0
Explanation: D = {}
Example 3:
Input: A = ["zyx","wvu","tsr"]
Output: 3
Explanation: D = {0, 1, 2}
Constraints:
1 <= A.length <= 100
1 <= A[i].length <= 1000
這道題給了一個字符串數組,里面的字符串長度均相同,這樣如果將每個字符串看作一個字符數組的話,於是就可以看作的一個二維數組,題目要求所有列上的字符是非遞減順序的,問最少需要刪掉多少列。這道題唯一的難點就是讀懂晦澀的題意,估計是出自非母語之手的,其他的並沒有太大的難度,就是一個按列來遍歷二維數組的操作,若當前位置的字符小於等於下一行同列上的字符,則跳過繼續比較下一行和下下一行上的字符。否則說明需要刪掉該列,結果 res 自增1,且 break 掉當前列即可,參見代碼如下:
class Solution {
public:
int minDeletionSize(vector<string>& A) {
int n = A.size(), len = A[0].size(), res = 0;
for (int j = 0; j < len; ++j) {
for (int i = 0; i < n - 1; ++i) {
if (A[i][j] <= A[i + 1][j]) continue;
++res;
break;
}
}
return res;
}
};
Github 同步地址:
https://github.com/grandyang/leetcode/issues/944
參考資料:
https://leetcode.com/problems/delete-columns-to-make-sorted/