删列造序 II

给定由 n 个字符串组成的数组 strs,其中每个字符串长度相等。

选取一个删除索引序列,对于 strs 中的每个字符串,删除对应每个索引处的字符。

比如,有 strs = ["abcdef", "uvwxyz"],删除索引序列 {0, 2, 3},删除后 strs ["bef", "vyz"]

假设,我们选择了一组删除索引 answer,那么在执行删除操作之后,最终得到的数组的元素是按 字典序strs[0] <= strs[1] <= strs[2] ... <= strs[n - 1])排列的,然后请你返回 answer.length 的最小可能值。

 

示例 1:

输入:strs = ["ca","bb","ac"]输出:1解释:

删除第一列后,strs = ["a", "b", "c"]。

现在 strs 中元素是按字典排列的 (即,strs[0] <= strs[1] <= strs[2])。

我们至少需要进行 1 次删除,因为最初 strs 不是按字典序排列的,所以答案是 1。

示例 2:

输入:strs = ["xc","yb","za"]输出:0解释:

strs 的列已经是按字典序排列了,所以我们不需要删除任何东西。

注意 strs 的行不需要按字典序排列。

也就是说,strs[0][0] <= strs[0][1] <= ... 不一定成立。

示例 3:

输入:strs = ["zyx","wvu","tsr"]输出:3解释:

我们必须删掉每一列。

 

提示:

  • n == strs.length
  • 1 <= n <= 100
  • 1 <= strs[i].length <= 100
  • strs[i] 由小写英文字母组成

 

思路

1、逐个遍历元素,判断元素与下一元素的顺序是否升序

2、按照字符列逐个比较,如果不是升序,表示该列需要删除,则删除该列,并重新执行1

3、直到所有都是按照顺序

代码

 

import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

/**
 *https://leetcode.cn/problems/delete-columns-to-make-sorted-ii/description/
 * 贪心
 */
public class Main {
    public static void main(String[] args) {
        Solution solution = new Solution();
        int i = solution.minDeletionSize(new String[] {"ousnatait", "xzswvwztr", "luknznxob"});
        System.out.println(i);
        //        solution.maxSlidingWindow(new int[]{1,3,-1,-3,5,3,6,7}, 3);
    }

}

class Solution {
    public int minDeletionSize(String[] strs) {
        HashSet<Integer> delContainer = new HashSet<>();
        //1、冒泡遍历,两两比较顺序
        for (int i = 0; i < strs.length - 1; i++) {
            while (!isOrder(strs[i], strs[i + 1], delContainer)){
                i = 0;
            }
            if (delContainer.size() == strs[0].length()){
                break;
            }
        }
        return delContainer.size();
    }

    private boolean isOrder(String s1, String s2, HashSet<Integer> delContainer) {
        for (int i = 0; i < s1.length(); i++) {
            if (delContainer.contains(i)){
                continue;
            }
            if (s1.charAt(i) < s2.charAt(i)){
                return true;
            }
            if (s1.charAt(i) > s2.charAt(i)){
                delContainer.add(i);
                return false;
            }
        }
        return true;
    }

}

 

posted @ 2023-09-01 22:14  Adom_ye  阅读(6)  评论(0编辑  收藏  举报