此题关键在于当两个字符串的第一位相等时,要判断下一位是否按字典序排列。设置一个标志位用于下一次循环时的判断条件是最好的办法,当前一行字符串的第一位比后一行字符串的第一位小,令标志位为1,反过来想便是当前一行字符串的第一位大于等于后一行字符串的第一位时,标志位为0,只有当标志位为0和前一行比后一行大同时满足时,才删除该列。代码如下所示:
class Solution {
public:
int minDeletionSize(vector<string>& strs) {
//if(strs == nullptr) return 0;
int m = strs[0].size();
int n = strs.size();
int cnt = 0;
vector<int> mark(n-1);
for(int i=0; i<m; i++){
for(int j=1; j<n; j++)
if(!mark[j-1] && strs[j-1][i] > strs[j][i]) goto next;
for(int j=1; j<n; j++)
if(strs[j-1][i] < strs[j][i]) mark[j-1] = true;
continue;
next:cnt++;
}
return cnt;
}
};