当前位置:   article > 正文

一个串的最长回文子序列的长度

一个串的最长回文子序列的长度

题目描述:给定一个字符串str,返回这个字符串的最长回文子序列的长度,比如 str="a12b3c43def2ghi1kpm",最长回文子序列是”1234321" 或者"123c321",返回长度7。

way:转化为求原串和逆序串的最长公共子序列。

way2:f函数,计算str从L到R上的最长回文子序列的长度。要L不要R,要R不要L,要L要R,不要L不要R。终止条件。

  1. //返回str[L...R]的最长回文子序列长度
  2. int f(string s, int L, int R)
  3. {
  4. if(L==R) return 1;
  5. if(L==R-1)
  6. {
  7. return s[L]==s[R]?2:1;
  8. }
  9. //要L不要R
  10. int p1=f(s, L, R-1);
  11. //要R不要L
  12. int p2=f(s, L+1, R);
  13. //不要L不要R
  14. int p3=f(s, L+1, R-1);
  15. //要L要R
  16. int p4=f(s, L+1, R-1) +s[L]==s[R]?2:0;
  17. return max(p1,max(p2,max(p3,p4)));
  18. }
  19. int way(string s)
  20. {
  21. int n=s.size();
  22. return f(s, 0, n-1);
  23. }

way3:改dp。一定要画图看。

  1. //改dp
  2. int way2(string s)
  3. {
  4. int n=s.size();
  5. if(n==0) return 0;
  6. vector<vector<int>>dp(n, vector<int>(n,0));
  7. dp[n-1][n-1]=1;
  8. for(int i=0; i<=n-2; i++)
  9. {
  10. dp[i][i]=1;
  11. dp[i][i+1]=s[i]==s[i+1]?2:1;
  12. }
  13. //L从大往小,R从小往大,画图将dp[i][i],dp[i][i+1]填掉也知道L从n-3开始
  14. for(int L=n-3; L>=0; L--)
  15. {
  16. for(int R=L+2; R<n; R++)
  17. {
  18. int p1=dp[L][R-1];
  19. int p2=dp[L+1][R];
  20. int p3=dp[L+1][R-1]+s[L]==s[R]?2:0;
  21. dp[L][R]=max(p1,max(p2,p3));
  22. }
  23. }
  24. return dp[0][n-1];
  25. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/600206
推荐阅读
相关标签
  

闽ICP备14008679号