经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » 编程经验 » 查看文章
712. Minimum ASCII Delete Sum for Two Strings
来源:cnblogs  作者:PilgrimHui  时间:2018/10/9 9:53:13  对本文有异议

问题

给定两个字符串,删除字符使得两个字符串相等,如何删使得删除的字符的ASCII和最小。

Input: s1 = "sea", s2 = "eat"
Output: 231
Explanation: 115(s) + 116(t) = 231

思路

用dp[i][j]表示s1[:i]和s2[:j]之间的解。
如果s1[i-1] == s2[j-1],dp[i][j] = dp[i-1][j-1]。两字符相等,不需要删除,等于之前的值。
否则,dp[i][j] = min(dp[i-1][j]+ s1[i-1], dp[i][j-1] + s2[j-1])。不等,需要删除,在之前的结果基础上,计算删s1字符的代价和删s2字符的代价哪个小。

时间复杂度O(n^2),空间复杂度O(n^2)

代码

  1. class Solution(object):
  2. def minimumDeleteSum(self, s1, s2):
  3. """
  4. :type s1: str
  5. :type s2: str
  6. :rtype: int
  7. """
  8. dp = [[0 for _ in range(len(s2)+1)] for _ in range(len(s1)+1)]
  9. for i in range(1,len(s2)+1):
  10. dp[0][i] = dp[0][i-1] + ord(s2[i-1])
  11. for j in range(1,len(s1)+1):
  12. dp[j][0] = dp[j-1][0] + ord(s1[j-1])
  13. for i in range(1,len(s1)+1):
  14. for j in range(1,len(s2)+1):
  15. if(s1[i-1]==s2[j-1]):
  16. dp[i][j] = dp[i-1][j-1]
  17. else:
  18. dp[i][j] = min(dp[i-1][j]+ord(s1[i-1]), dp[i][j-1]+ord(s2[j-1]))
  19. return dp[len(s1)][len(s2)]

相关知识

  1. ord('a') == 97 #获取字符对应的ASCII码
  2. chr(97) == 'a' #获取ASCII码对应的字符
  3. chr(0x61) == 'a' #可以输入十六进制
  4. hex(97) == '0x61' #获取整数对应的十六进制字符串
  5. oct(97) == '0141' #获取整数对应的八进制字符串
 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号