假设我们有一个由N个字符串组成的数组A。每个字符串均由小写字母组成,且长度均相同。现在,我们可以选择任何一组删除索引,并且对于每个字符串,我们将删除这些索引中的所有字符。现在考虑我们采用了一组删除索引D,以便在删除之后,最终数组具有字典序中的每个元素顺序。
为了清楚起见,A [0]按字典顺序排序(因此A [0] [0] <= A [0] [1] <= ... <= A [0] [n-1]),A [1 ]以字典顺序排列(即A [1] [0] <= A [1] [1] <= ... <= A [1] [n-1]),依此类推。(这里n是字符串的大小)。我们必须找到D大小的最小可能值。
因此,如果输入类似于[“ cbcdb”,“ ccbxc”],则输出将为3
为了解决这个问题,我们将遵循以下步骤-
ret:= 0
n:= A的大小
m:= A [0]的大小
定义大小为(m + 1)的数组lis,并用1填充
对于初始化i:= 0,当i <m时,更新(将i增加1),执行-
好的:=真
对于初始化k:= 0,当k <n时,更新(将k增加1),-
如果ok不为零,则-
好的:=假
从循环中出来
如果A [k,j]> A [k,i],则
lis [i]:= lis [j] + 1和lis [i]的最大值
ret:= ret和lis [i]的最大值
对于初始化j:= 0,当j <i时,更新(将j增加1),执行-
如果ret与0相同,则-
返回m-1
返回m-ret
让我们看下面的实现以更好地理解-
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int minDeletionSize(vector<string>& A){
int ret = 0;
int n = A.size();
int m = A[0].size();
vector<int> lis(m + 1, 1);
for (int i = 0; i < m; i++) {
for (int j = 0; j < i; j++) {
bool ok = true;
for (int k = 0; k < n; k++) {
if (A[k][j] > A[k][i]) {
ok = false;
break;
}
}
if (ok) {
lis[i] = max(lis[j] + 1, lis[i]);
ret = max(ret, lis[i]);
}
}
}
if (ret == 0)
return m - 1;
return m - ret;
}
};
main(){
Solution ob;
vector<string> v = {"cbcdb","ccbxc"};
cout << (ob.minDeletionSize(v));
}{"cbcdb","ccbxc"}输出结果
3