class Solution {
public:
int minDeletionSize(vector<string>& strs) {
}
};
960. 删列造序 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 这三列后,最终得到的数组是 A = ["bc", "az"]。 这两行是分别按字典序排列的(即,A[0][0] <= A[0][1] 且 A[1][0] <= A[1][1])。 注意,A[0] > A[1] —— 数组 A 不一定是按字典序排列的。
示例 2:
输入:strs = ["edcba"] 输出:4 解释:如果删除的列少于 4 列,则剩下的行都不会按字典序排列。
示例 3:
输入:strs = ["ghi","def","abc"] 输出:0 解释:所有行都已按字典序排列。
提示:
n == strs.length
1 <= n <= 100
1 <= strs[i].length <= 100
strs[i]
由小写英文字母组成原站题解
golang 解法, 执行用时: 8 ms, 内存消耗: 3.5 MB, 提交时间: 2023-09-27 07:48:23
func minDeletionSize(strs []string) int { m, n := len(strs), len(strs[0]) dp := make([]int, n) maxLen := 0 // 遍历每一列 for i := 0; i < n; i++ { dp[i] = 1 for j := 0; j < i; j++ { less := true for k := 0; k < m; k++ { if strs[k][j] > strs[k][i] { less = false break } } if less { dp[i] = max(dp[i], dp[j]+1) } } maxLen = max(maxLen, dp[i]) } return n - maxLen } func max(i, j int) int { if i > j { return i } return j }
python3 解法, 执行用时: 172 ms, 内存消耗: 16 MB, 提交时间: 2023-09-27 07:44:25
class Solution: def minDeletionSize(self, strs: List[str]) -> int: W = len(strs[0]) dp = [1] * W for i in range(W-2, -1, -1): for j in range(i+1, W): if all(row[i] <= row[j] for row in strs): dp[i] = max(dp[i], 1 + dp[j]) return W - max(dp)
java 解法, 执行用时: 8 ms, 内存消耗: 40.2 MB, 提交时间: 2023-09-27 07:43:34
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; } }