加载中...
960-删列造序 III(Delete Columns to Make Sorted III)
发表于:2021-12-03 | 分类: 困难
字数统计: 1.1k | 阅读时长: 5分钟 | 阅读量:

原文链接: https://leetcode-cn.com/problems/delete-columns-to-make-sorted-iii

英文原文

You are given an array of n strings strs, all of the same length.

We may choose any deletion indices, and we delete all the characters in those indices for each string.

For example, if we have strs = ["abcdef","uvwxyz"] and deletion indices {0, 2, 3}, then the final array after deletions is ["bef", "vyz"].

Suppose we chose a set of deletion indices answer such that after deletions, the final array has every string (row) in lexicographic order. (i.e., (strs[0][0] <= strs[0][1] <= ... <= strs[0][strs[0].length - 1]), and (strs[1][0] <= strs[1][1] <= ... <= strs[1][strs[1].length - 1]), and so on). Return the minimum possible value of answer.length.

 

Example 1:

Input: strs = ["babca","bbazb"]
Output: 3
Explanation: After deleting columns 0, 1, and 4, the final array is strs = ["bc", "az"].
Both these rows are individually in lexicographic order (ie. strs[0][0] <= strs[0][1] and strs[1][0] <= strs[1][1]).
Note that strs[0] > strs[1] - the array strs is not necessarily in lexicographic order.

Example 2:

Input: strs = ["edcba"]
Output: 4
Explanation: If we delete less than 4 columns, the only row will not be lexicographically sorted.

Example 3:

Input: strs = ["ghi","def","abc"]
Output: 0
Explanation: All rows are already lexicographically sorted.

 

Constraints:

  • n == strs.length
  • 1 <= n <= 100
  • 1 <= strs[i].length <= 100
  • strs[i] consists of lowercase English letters.
  •  

中文题目

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

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

比如,有 A = ["babca","bbazb"],删除索引序列 {0, 1, 4},删除后 A 为["bc","az"]

假设,我们选择了一组删除索引 D,那么在执行删除操作之后,最终得到的数组的行中的每个元素都是按字典序排列的。

清楚起见,A[0] 是按字典序排列的(即,A[0][0] <= A[0][1] <= ... <= A[0][A[0].length - 1]),A[1] 是按字典序排列的(即,A[1][0] <= A[1][1] <= ... <= A[1][A[1].length - 1]),依此类推。

请你返回 D.length 的最小可能值。

 

示例 1:

输入:["babca","bbazb"]
输出:3
解释:
删除 0、1 和 4 这三列后,最终得到的数组是 A = ["bc", "az"]。
这两行是分别按字典序排列的(即,A[0][0] <= A[0][1] 且 A[1][0] <= A[1][1])。
注意,A[0] > A[1] —— 数组 A 不一定是按字典序排列的。

示例 2:

输入:["edcba"]
输出:4
解释:如果删除的列少于 4 列,则剩下的行都不会按字典序排列。

示例 3:

输入:["ghi","def","abc"]
输出:0
解释:所有行都已按字典序排列。

 

提示:

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

通过代码

官方题解

方法 1:动态规划

想法和算法

这是一个复杂的问题,很难抽象出解题思路。

首先,找出需要保留的列数,而不是需要删除的列数。最后,可以相减得到答案。

假设我们一定保存第一列 C,那么保存的下一列 D 就必须保证每行都是字典有序的,也就是 C[i] <= D[i]。那么我们就可以删除 CD 之间的所有列。

我们可以用动态规划来解决这个问题,让 dp[k] 表示在输入为 [row[k:] for row in A] 时保存的列数,那么 dp[k] 的递推式显而易见。

[]
class Solution { public int minDeletionSize(String[] A) { int W = A[0].length(); int[] dp = new int[W]; Arrays.fill(dp, 1); for (int i = W-2; i >= 0; --i) search: for (int j = i+1; j < W; ++j) { for (String row: A) if (row.charAt(i) > row.charAt(j)) continue search; dp[i] = Math.max(dp[i], 1 + dp[j]); } int kept = 0; for (int x: dp) kept = Math.max(kept, x); return W - kept; } }
[]
class Solution(object): def minDeletionSize(self, A): W = len(A[0]) dp = [1] * W for i in xrange(W-2, -1, -1): for j in xrange(i+1, W): if all(row[i] <= row[j] for row in A): dp[i] = max(dp[i], 1 + dp[j]) return W - max(dp)

复杂度分析

  • 时间复杂度:$O(N * W^2)$,其中 $N$ 是 A 的长度,$W$ 是 A 中每个单词的长度。
  • 空间复杂度:$O(W)$。

统计信息

通过次数 提交次数 AC比率
2088 3745 55.8%

提交历史

提交时间 提交结果 执行时间 内存消耗 语言
上一篇:
958-二叉树的完全性检验(Check Completeness of a Binary Tree)
下一篇:
959-由斜杠划分区域(Regions Cut By Slashes)
本文目录
本文目录