当前位置:   article > 正文

【动态规划】LeetCode1092. 最短公共超序列_动态规划 最短公共超序列

动态规划 最短公共超序列

1092. 最短公共超序列

 给定字符串a,b,求a,b的最短公共超序列,即a,b同时是这个序列的子序列且这个序列最短。

转化位编辑距离的问题

【动态规划】区间dp:编辑距离_暮色_年华的博客-CSDN博客

问题可以转化为:

对a进行添加操作,使得添加后的a包含b,求最少的添加次数。

 解释:

如果想要在a[i]后添加一个字符后做到a包含b,那么必须使a[ 1 ~ i ]包含b[ 1~ j-1 ],即 在这种情况下  dp[ i ] [ j ] = dp[ i ][ j - 1 ] + 1 。

如果在a[i]后不添加字符就可以做到a包含b,那么当 a[ i ] ! =b[ j ] 时,把a[i]去掉后a依然可以包含b[j],所以在这种情况下,dp[ i ][ j ] = dp[ i-1 ][ j ]

当a[ i ] = = b [ j ] 时 , 可以 不用 a[ i ]取匹配 b[ j ],dp[ i ][ j ]=dp[ i -1 ][ j ],也可以用a [ i ] 去匹配

b[ j ],dp[ i ][ j ]=dp[ i-1 ][ j- 1]

?用for循环逆序输出结果。

  1. class Solution {
  2. public:
  3. string shortestCommonSupersequence(string a, string b) {
  4. int n = a.size(), m = b.size(), INF = 1e8;
  5. vector<vector<int>> f(n + 1, vector<int>(m + 1, INF));
  6. for (int i = 0; i <= n; i ++ ) f[i][0] = 0;
  7. for (int i = 1; i <= m; i ++ ) f[0][i] = i;
  8. for (int i = 1; i <= n; i ++ )
  9. for (int j = 1; j <= m; j ++ ) {
  10. f[i][j] = min(f[i][j - 1] + 1, f[i - 1][j]);
  11. if (a[i - 1] == b[j - 1])
  12. f[i][j] = min(f[i][j], f[i - 1][j - 1]);
  13. }
  14. string res;
  15. for (int i = n, j = m; i >= 0;) {
  16. if (!i || !j || a[i - 1] != b[j - 1]) {
  17. if (j && f[i][j] == f[i][j - 1] + 1) {
  18. res += b[ -- j];
  19. } else {
  20. if (i) res += a[ -- i];
  21. else i -- ;
  22. }
  23. } else {
  24. if (f[i][j] == f[i][j - 1] + 1) {
  25. res += b[ -- j];
  26. } else if (f[i][j] == f[i - 1][j]) {
  27. res += a[ -- i];
  28. } else {
  29. res += a[ -- i];
  30. j -- ;
  31. }
  32. }
  33. }
  34. reverse(res.begin(), res.end());
  35. return res;
  36. }
  37. };

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/169535
推荐阅读
相关标签
  

闽ICP备14008679号