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