【leetcode】960. Delete Columns to Make Sorted III

题目以下:less

We are given an array A of N lowercase letter strings, all of the same length.spa

Now, we may choose any set of deletion indices, and for each string, we delete all the characters in those indices.code

For example, if we have an array A = ["babca","bbazb"] and deletion indices {0, 1, 4}, then the final array after deletions is ["bc","az"].blog

Suppose we chose a set of deletion indices D such that after deletions, the final array has every element (row) in lexicographic order.element

For clarity, A[0] is in lexicographic order (ie. A[0][0] <= A[0][1] <= ... <= A[0][A[0].length - 1]), A[1] is in lexicographic order (ie. A[1][0] <= A[1][1] <= ... <= A[1][A[1].length - 1]), and so on.input

Return the minimum possible value of D.length.string

Example 1:it

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

Example 2:io

Input: ["edcba"]
Output: 4 Explanation: If we delete less than 4 columns, the only row won't be lexicographically sorted. 

Example 3:class

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

Note:

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

解题思路:本题能够采用动态规划的方法。记dp[i][0] = v表示不删除第i个元素时,使得0~i子区间有序须要删除掉v个字符,dp[i][1] = v表示删除第i个元素时,使得0~i子区间有序须要删除掉v个字符。先看第种状况,由于对第i个元素删除操做,因此其值彻底和dp[i-1]有关,有dp[i][1] = min(dp[i-1][0],dp[i-1][1]) + 1,取第i个元素删除或者不删除时候的较小值;而若是第i个元素保留,那么咱们只须要找出离i最近的保留的元素j,使得Input 中每个元素 item 都须要知足 item[i] > item[j],这样的j可能不存在或者有多个,找出知足 dp[i][0] = min(dp[i][0],dp[j][0] + (i-j-1)) 最小的便可,若是没有这样的j存在,令dp[i][0] = i。最后的结果为 dp[-1][0]和dp[-1][1]中的较小值。

代码以下:

class Solution(object):
    def minDeletionSize(self, A):
        """
        :type A: List[str]
        :rtype: int
        """
        dp = [[float('inf')] * 2 for _ in A[0]]
        dp[0][0] = 0 # 0 : keep; 1:delete
        dp[0][1] = 1

        for i in range(1,len(A[0])):
            dp[i][1] = min(dp[i-1][0],dp[i-1][1]) + 1
            dp[i][0] = i
            for j in range(i):
                flag = True
                for k in range(len(A)):
                    if A[k][i] < A[k][j]:
                        flag = False
                        break
                if flag:
                    dp[i][0] = min(dp[i][0],dp[j][0] + (i-j-1))
        return min(dp[-1])
相关文章
相关标签/搜索