删除列以在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