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 };
原文地址:https://www.cnblogs.com/NirobertEinteson/p/11986527.html