zoukankan      html  css  js  c++  java
  • 944. 删列造序

    944. 删列造序

    描述:

    给定由 N 个小写字母字符串组成的数组 A,其中每个字符串长度相等。

    删除 操作的定义是:选出一组要删掉的列,删去 A 中对应列中的所有字符,形式上,第 n 列为 [A[0][n], A[1][n], ..., A[A.length-1][n]])。

    比如,有 A = ["abcdef", "uvwxyz"],

    要删掉的列为 {0, 2, 3},删除后 A 为["bef", "vyz"], A 的列分别为["b","v"], ["e","y"], ["f","z"]。

    你需要选出一组要删掉的列 D,对 A 执行删除操作,使 A 中剩余的每一列都是 非降序 排列的,然后请你返回 D.length 的最小可能值。 

    示例 1:

    输入:["cba", "daf", "ghi"]
    输出:1
    解释:
    当选择 D = {1},删除后 A 的列为:["c","d","g"] 和 ["a","f","i"],均为非降序排列。
    若选择 D = {},那么 A 的列 ["b","a","h"] 就不是非降序排列了。
    示例 2:

    输入:["a", "b"]
    输出:0
    解释:D = {}
    示例 3:

    输入:["zyx", "wvu", "tsr"]
    输出:3
    解释:D = {0, 1, 2}

    提示:

    1 <= A.length <= 100
    1 <= A[i].length <= 1000

     1 解法1:64 ms    13.1 MB
     2 class Solution {
     3 public:
     4     int minDeletionSize(vector<string>& A) {
     5         /*
     6         思路:字符串每个长度都相等,相等于二维数组一样
     7                A中的列是非降序排序 即:升序排列
     8               遍历每一列字符串中的每一个字符;
     9               遍历A.size()行,若前一行>后一行  那么删除这一列,贪心
    10               否则继续,进行下一个比较
    11               最后统计字符串的长度;原先字符串的长度-现在剩余的长度,就是删除的列D
    12         */
    13         int sum=A[0].size();//记录原先多少列
    14         //如果只有一个数据["a.."]; 返回0;
    15         if(A.size()==1) return 0;
    16         vector<int> v;
    17         for(int i=0;i<A[0].size();i++){//遍历所有列,看列是否是递增的
    18             for(int j=1;j<A.size();j++){
    19                 if(A[j-1][i]-'a'>A[j][i]-'a'){//贪心 不满足就删除
    20                     for(int k=0;k<A.size();k++){//删除列
    21                         A[k].erase(i,1);
    22                     }
    23                     i--;//恢复 回到当前列,跳出,继续从现在这一列开始
    24                     break;
    25                 }
    26             }
    27         }
    28         return sum-A[0].size();//删除了多少列
    29     }
    30 };
     1 优化;不需要删除,定义一个 变量++就可以了
     2 解法2:    52 ms    13 MB    
     3 class Solution {
     4 public:
     5     int minDeletionSize(vector<string>& A) {
     6         /*
     7         思路:字符串每个长度都相等,相等于二维数组一样
     8                A中的每一列是非降序排序 即:升序排列,最后求删除多少不和的列cnt
     9               遍历每一列字符串中的每一个字符;
    10               遍历A.size()行,若前一行>后一行 那么删除这一列,贪心
    11               否则继续,进行下一个比较
    12               输出cnt删除的列数即可
    13         */
    14         //如果只有一个数据["a.."]; 返回0;
    15         if(A.size()==1) return 0;
    16         int cnt=0;
    17         for(int i=0;i<A[0].size();i++){//遍历所有列,看列是否是递增的
    18             for(int j=1;j<A.size();j++){
    19                 if(A[j-1][i]>A[j][i]){//贪心 不满足就删除
    20                     cnt++;//跳出 执行下一列 ,继续从现在这一列开始
    21                     break;
    22                 }
    23             }
    24         }
    25         return cnt;//删除了多少列
    26     }
    27 };
     1 也可以正向做:
     2 解法3:    52 ms    13 MB
     3 
     4 class Solution {
     5 public:
     6     int minDeletionSize(vector<string>& A) {
     7         int count = 0;
     8         for(int i=0;i<A[0].length();i++){
     9             for(int j=0;j<A.size()-1;j++){
    10                 if(A[j][i]>A[j+1][i]){
    11                     count++;
    12                     break;
    13                 }
    14             }
    15         }
    16         return count;
    17     }
    18 };
  • 相关阅读:
    主席树模板之区间问题
    简易版第k大(权值线段树+动态开点模板)
    Irrigation
    Petya and Array
    H. Pavel's Party(权值线段树)
    权值线段树入门
    位数差(二分)
    ZYB's Premutation(树状数组+二分)
    单调队列入门
    javaBean为什么要implements Serializable?
  • 原文地址:https://www.cnblogs.com/NirobertEinteson/p/11986527.html
Copyright © 2011-2022 走看看