暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

955. Delete Columns to Make Sorted II删列造序

程序媛的梦想 2020-02-18
246

给一个字符串数组A,里面的每个元素(字符串)长度相同,将每个元素上某些位置的字符(每个元素相同位置上的都得删)删掉,使得得到的字符串是按字母序排序的,如果都不满足,可以删掉所有的字符。问要每个元素要删除的最少的长度。

注:如果是多个字母,比如"yb"和"za"的字母序怎么算呢?

先按第一个字母排序,也就是说yxxx的肯定比zyyyy的在前面, 如果第一个字母相同,比较第二个字母,以此类推。


思路:贪心算法。


时间复杂度:O(NW²),N=A.length, M=A[i].length();

空间复杂度:O(NW)。

 1import java.util.Arrays;
2
3/**
4 * @author lxn
5 * @description 955. Delete Columns to Make Sorted II
6 * @create 2020-02-18 20:56
7 */

8public class Algorithm955 {
9    public static void main(String[] args) {
10        String[] A = {"ca""bb""ac"};
11        int res = new Solution955().minDeletionSize(A);
12    }
13}
14
15class Solution955 {
16    public int minDeletionSize(String[] A) {
17        int N = A.length;
18        int W = A[0].length();
19        int res = 0;
20
21        String[] cur = new String[N];
22        for (int j = 0; j < W; ++j) { // 遍历第几个index
23            // j = 0, cur = {null, null, null}; j = 1, 也都是null; j = 2, cur = {"nulla", "nullb", "nullc"};
24            // copy cur数组,如果N比cur的长度大,那么多出的用null(因为是String,如果是int,那就用0填充)填充。
25            // 为什么要用cur2呢?内层for循环要给cur2赋值。而cur的话,只有当前i的字符们是字典序的时候才会接受cur2的赋值。
26            String[] cur2 = Arrays.copyOf(cur, N);
27            for (int i = 0; i < N; ++i) // 遍历第几个元素(字符串)
28                cur2[i] += A[i].charAt(j);// j=0, cur2 = {"nullc", "nullb", "nulla"}; j=1, cur2={"nullb", "nullb", "nullc"};
29
30            // 如果这些字符串是按字典序,那就cur2赋值给cur。赋值给它有什么用处呢?因为外层for循环的时候还会用到这个cur。
31            if (isSorted(cur2)) cur = cur2;// 是字典序
32            else res++; // 不是字典序,说明要删除index加1
33        }
34
35        return res;
36    }
37
38    // 按字典序排序
39    private boolean isSorted(String[] A) {
40        for (int i = 0; i < A.length - 1; ++i) {
41            // compareTo(): 按字典序比较,若此字符串大于字符串参数,则返回一个大于 0 的值
42            if (A[i].compareTo(A[i + 1]) > 0return false;
43        }
44
45        return true;
46    }
47}

文章转载自程序媛的梦想,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论