题目描述
给定由 N
个小写字母字符串组成的数组 A
,其中每个字符串长度相等。
选取一个删除索引序列,对于 A
中的每个字符串,删除对应每个索引处的字符。 所余下的字符串行从上往下读形成列。
比如,有 A = ["abcdef", "uvwxyz"]
,删除索引序列 {0, 2, 3}
,删除后 A
为 ["bef", "vyz"]
,A
的列分别为 ["b","v"]
、["e","y"]
、["f","z"]
。(形式上,第 c
列为 [A[0][c], A[1][c], ..., A[A.length-1][c]]
)。
假设,我们选择了一组删除索引 D
,那么在执行删除操作之后,A
中所剩余的每一列都必须是非降序排列的,然后请你返回 D.length
的最小可能值。
样例
输入:["cba", "daf", "ghi"]
输出:1
解释:
当选择 D = {1},删除后 A 的列为:["c","d","g"] 和 ["a","f","i"],均为非降序排列。
若选择 D = {},那么 A 的列 ["b","a","h"] 就不是非降序排列了。
输入:["a","b"]
输出:0
解释:D = {}
输入:["zyx","wvu","tsr"]
输出:3
解释:D = {0, 1, 2}
注意
1 <= A.length <= 100
1 <= A[i].length <= 1000
算法
(暴力枚举) $O(nm)$
- 直接枚举每一列,判断这一列是否存在降序的情况,如果存在删除即可。
时间复杂度
- 遍历整个矩阵,故时间复杂度为 $O(nm)$。
C++ 代码
class Solution {
public:
bool check(const vector<string>& A, int c) {
for (int i = 0; i < A.size() - 1; i++)
if (A[i + 1][c] < A[i][c])
return false;
return true;
}
int minDeletionSize(vector<string>& A) {
int m = A[0].size();
int ans = 0;
for (int j = 0; j < m; j++)
if (check(A, j) == false)
ans++;
return ans;
}
};