删除列以在C ++中进行排序III
假设我们有一个由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