[关闭]
@snuffles 2019-04-11T10:50:59.000000Z 字数 1040 阅读 753

L5 最长回文子串

字符串


给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:
输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。
示例 2:
输入: "cbbd"
输出: "bb"

解1:
解2:
解3:背包
解4:马拉车

  1. string longestPalindrome(string s) {
  2. if(s.empty()) return "";
  3. int dp[s.size()][s.size()] = {0},left=0,right=0,len=0;
  4. //dp[i,j]=1 j=i;
  5. //dp[i,j]=s[i]==s[j] j=i+1;
  6. //dp[i,j]=s[i]==s[j]&&dp[i+1,j-1] if j>i+1
  7. //注意 用int dp[][]
  8. for(int i=0;i<s.size();i++){
  9. dp[i][i]=1;
  10. for(int j=0;j<i;j++){
  11. dp[j][i]= s[i]==s[j] && (i-j<2 || dp[j+1][i-1]);
  12. if(dp[j][i] && len <i-j+1){
  13. len = i-j+1;
  14. left = j;
  15. right =i;
  16. }
  17. }
  18. }
  19. return s.substr(left,right-left+1);
  20. }
  1. string longestPalindrome(string s) {
  2. int len = s.length();
  3. //int **dp = new int*[len+1];
  4. vector<vector<int> > dp(len+1,vector<int>(len+1));
  5. //for(int i = 0; i < len+1; i++)
  6. // dp[i] = new int[len+1];
  7. // for(int i = 0; i < len+1; i++){
  8. // for(int j = 0; j < len+1; j++){
  9. // dp[i][j] = 0;
  10. // }
  11. // }
  12. for(int j = 0; j < len; j++){
  13. dp[j][j] = 1;
  14. dp[j+1][j] = 1;//这里也就是说的要手动初始话的这种情况
  15. }
  16. int l = 0, r = 0;
  17. for(int i = 1; i < len; i++){
  18. for(int j = 0; j+i < len; j++){
  19. if(s[j] == s[i+j] && dp[j+1][i+j-1]){
  20. //为了保证j+1 <= i+j-1, i >= 2那么将i也就是长度为1的手动初始化
  21. l = j;
  22. r = j + i;
  23. dp[l][r] = 1;
  24. }
  25. }
  26. }
  27. string str = "";
  28. for(int i = l; i <= r; i++)
  29. str += s[i];
  30. return str;
  31. //delete dp;
  32. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注