当前位置:   article > 正文

5力扣:最长回文子串

5力扣:最长回文子串

  1. class Solution {
  2. public:
  3. string longestPalindrome(string s) {
  4. int n=s.size();
  5. if(n<2) return s;
  6. vector<vector<bool>> dp(n,vector<bool>(n,false));
  7. for(int i=0;i<n;i++){
  8. dp[i][i]=true;
  9. }
  10. int maxLen=1;
  11. int loc=0;
  12. for(int L=2;L<=n;L++){
  13. for(int i=0;i<=n-1-L+1;i++){
  14. int j=i+L-1;
  15. if(s[i]!=s[j]){
  16. dp[i][j]=false;
  17. }
  18. else{
  19. if(j-i<3){
  20. dp[i][j]=true;
  21. }else{
  22. dp[i][j]=dp[i+1][j-1];
  23. }
  24. }
  25. if(dp[i][j] && j-i+1>maxLen){
  26. maxLen=j-i+1;
  27. loc=i;
  28. }
  29. }
  30. }
  31. string res="";
  32. for(int i=loc;i<loc+maxLen;i++){
  33. res+=s[i];
  34. }
  35. return res;
  36. }
  37. };
  1. class Solution {
  2. public:
  3. string longestPalindrome(string s) {
  4. int n=s.size();
  5. vector<vector<bool>> dp(n,vector<bool>(n,true));
  6. for(int i=n-1;i>=0;i--){
  7. for(int j=i+1;j<n;j++){
  8. dp[i][j]=(s[i]==s[j]) && dp[i+1][j-1];
  9. }
  10. }
  11. int maxLoc=0;
  12. int maxLen=1;
  13. for(int i=0;i<n;i++){
  14. for(int j=i;j<n;j++){
  15. if(dp[i][j] && j-i+1>maxLen){
  16. maxLen=j-i+1;
  17. maxLoc=i;
  18. }
  19. }
  20. }
  21. return s.substr(maxLoc,maxLen);
  22. }
  23. };

从后到前遍历是为了让每一次遍历时所需用到的子串提前被计算过。

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

闽ICP备14008679号