假设我们有一个由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