0960-删列造序 III
给定由 n 个小写字母字符串组成的数组 strs ,其中每个字符串长度相等。
选取一个删除索引序列,对于 strs 中的每个字符串,删除对应每个索引处的字符。
比如,有 strs = ["abcdef","uvwxyz"] ,删除索引序列 {0, 2, 3} ,删除后为 ["bef", "vyz"] 。
假设,我们选择了一组删除索引 answer ,那么在执行删除操作之后,最终得到的数组的行中的 每个元素 都是按 字典序 排列的(即(strs[0][0] <= strs[0][1] <= ... <= strs[0][strs[0].length - 1]) 和(strs[1][0] <= strs[1][1] <= ... <= strs[1][strs[1].length - 1]) ,依此类推)。
请返回 _ answer.length 的最小可能值_ 。
示例 1:
**输入:** strs = ["babca","bbazb"]
**输出:** 3
**解释:** 删除 0、1 和 4 这三列后,最终得到的数组是 strs = ["bc", "az"]。
这两行是分别按字典序排列的(即,strs[0][0] <= strs[0][1] 且 strs[1][0] <= strs[1][1])。
注意,strs[0] > strs[1] —— 数组 strs 不一定是按字典序排列的。
示例 2:
**输入:** strs = ["edcba"]
**输出:** 4
**解释:** 如果删除的列少于 4 列,则剩下的行都不会按字典序排列。
示例 3:
**输入:** strs = ["ghi","def","abc"]
**输出:** 0
**解释:** 所有行都已按字典序排列。
提示:
n == strs.length1 <= n <= 1001 <= strs[i].length <= 100strs[i]由小写英文字母组成
方法 1:动态规划
想法和算法
这是一个复杂的问题,很难抽象出解题思路。
首先,找出需要保留的列数,而不是需要删除的列数。最后,可以相减得到答案。
假设我们一定保存第一列 C,那么保存的下一列 D 就必须保证每行都是字典有序的,也就是 C[i] <= D[i]。那么我们就可以删除 C 和 D 之间的所有列。
我们可以用动态规划来解决这个问题,让 dp[k] 表示在输入为 [row[k:] for row in A] 时保存的列数,那么 dp[k] 的递推式显而易见。
1 | class Solution { |
1 | class Solution(object): |
复杂度分析
- 时间复杂度:O(N * W^2),其中 N 是
A的长度,W 是A中每个单词的长度。 - 空间复杂度:O(W)。
Comments