题目如下:

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

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

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"].

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

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.

Return the minimum possible value of D.length.

Example 1:

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:

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

Example 3:

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])

最新文章

  1. SQL注入的字符串连接函数
  2. [笔记]CSS样式声明顺序
  3. codevs 1202 求和
  4. JS 实现中英文翻译
  5. Web 项目 中读取专用配置文件
  6. C++ 必知必会:条款16 指向成员函数的指针并非指针
  7. Linux中断(interrupt)子系统
  8. CSS实现文字上标、下标
  9. IOS 学习日志 2015-3-17
  10. 解决Java调用Azure SDK证书错误javax.net.ssl.SSLHandshakeException
  11. JAVA全套学习视频
  12. [物理学与PDEs]第4章第1节 引言
  13. psutil的几个例子
  14. PHP 无限极分类下拉列表实现
  15. zabbix图形化界面乱码(二)
  16. salesforce零基础学习(八十九)使用 input type=file 以及RemoteAction方式上传附件
  17. EBS 多sheet页Excel动态报表开发过程
  18. 通读Cheerio文档
  19. Android玩转百度地图Sha1获取正确姿势?
  20. 嵌入式开发之zynq——zynq开发环境搭建

热门文章

  1. python 将分词结果写入txt文件
  2. python AI换脸 用普氏分析法(Procrustes Analysis)实现人脸对齐
  3. 什么是云数据库RDS PPAS 版
  4. 云数据库RDS MySQL 版
  5. SpringMVC请求参数总结
  6. CSUST 2012 一个顶俩 (本校OJ题)(思维+树链剖分)
  7. # Pycharm打造高效Python IDE
  8. mysql行(记录)的详细的操作
  9. js日期相关方法
  10. CSS3鼠标滑过图片3D旋转动画