当前位置:   article > 正文

LeetCode之最长公共子序列问题LCS解决方法_leetcode lcs

leetcode lcs

Leetcode官网解答 使用动态规划原理,请参考原文地址:

https://leetcode-cn.com/problems/longest-common-subsequence/solution/zui-chang-gong-gong-zi-xu-lie-by-leetcod-y7u0/

image.png

图片来源官网解答:

那么问题来了,如何实现输出答案字符串呢?

下面是我的思路;

使用queue用来存储中间数据(字符串及下一次的ID),相当于BFS遍历。

从最后一个网格倒叙进行解答,查询字符是否一致,一致则加入字符串否则存储下一个的可能方向。

直到达到最底层。

  1. class Solution {
  2. public:
  3. int longestCommonSubsequence(string text1, string text2) {
  4. int m = text1.length(), n = text2.length();
  5. vector<vector<int>> vec(m+1,vector<int>(n+1));
  6. for(int i = 1; i <= m; i++)
  7. {
  8. char c1 = text1[i-1];
  9. for(int j = 1; j <= n; j++)
  10. {
  11. char c2 = text2[j-1];
  12. if(c1 == c2)
  13. vec[i][j] = vec[i-1][j-1]+1;
  14. else
  15. vec[i][j] = max(vec[i-1][j],vec[i][j-1]);
  16. }
  17. }
  18. //print all subsequences
  19. //last char position
  20. queue<pair<string,vector<int>>> q;
  21. q.push(pair<string,vector<int>>("",{m,n}));
  22. while(!q.empty())
  23. {
  24. string curr = q.front().first;
  25. vector<int> pos = q.front().second;
  26. q.pop();
  27. if(text1[pos[0]-1] == text2[pos[1]-1])
  28. {
  29. curr = text1[pos[0]-1] + curr;
  30. if(pos[0] > 1 && pos[1] > 1)
  31. {
  32. q.push(pair<string,vector<int>>(curr,{pos[0]-1,pos[1]-1}));
  33. }
  34. }
  35. else
  36. {
  37. if(vec[pos[0]-1][pos[1]] == vec[pos[0]][pos[1]])
  38. {
  39. if(pos[0] > 1 && pos[1] >= 1)
  40. {
  41. q.push(pair<string,vector<int>>(curr,{pos[0]-1,pos[1]}));
  42. }
  43. }
  44. if(vec[pos[0]][pos[1]-1] == vec[pos[0]][pos[1]])
  45. {
  46. if(pos[0] >= 1 && pos[1] > 1)
  47. {
  48. q.push(pair<string,vector<int>>(curr,{pos[0],pos[1]-1}));
  49. }
  50. }
  51. }
  52. if(curr.length() == vec[m][n])
  53. cout << curr << endl;
  54. }
  55. return vec[m][n];
  56. }
  57. };

 

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

闽ICP备14008679号