一、问题描述
给定一个字符串形的数组,求最小的删除数目,使得删除后的字符串是字典型有序的。
二、思路Code
package algorithm; /** * Created by adrian.wu on 2019/2/27. */ public class DeleteColumnsMakeSortedIII { /* j i b a b c a c b b a z b z 1、i 从前向后遍历 2、j 从i-1向前遍历 3、先求A[i]为止,如果使得字符串是sorted的,最少的deletion是多少?最大我们知道是i,即把前面的元素都删了 4、假如A[j]已经算好,则minDeletion = Math.min(dp[i], dp[j] + i - j - 1),把i和j之间的元素都抠出 5、如果i和j之间的元素有不抠出的情况怎么办?假定这个位置为k,那么用4的公式 minDeletion = Math.min(dp[i], dp[k] + k - j - 1) 6、因此重点是当 j < i时,dp[j]要算好。 */ public int minSizeDeletion(String[] A) { int n = A.length, res = n; int[] dp = new int[n]; for (int i = 0; i < n; i++) { dp[i] = i; for (int j = i - 1; j >= 0; j--) { if (legal(A, j, i)) { dp[i] = Math.min(dp[i], dp[j] + i - j - 1); } } res = Math.min(res, dp[i]); } return res; } public boolean legal(String[] A, int s, int e) { for (String a : A) if (a.charAt(s) > a.charAt(e)) return false; return true; } }