Advertisement
nikunjsoni

5

Jun 17th, 2021
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.52 KB | None | 0 0
  1. O(n^2) solution
  2.  
  3. class Solution {
  4. public:
  5.     string longestPalindrome(string s) {
  6.         int len=0, start=0, maxLen;
  7.         for(int i=0; i<s.length(); i++){
  8.             int len1 = findLen(s, i, i);
  9.             int len2 = findLen(s, i, i+1);
  10.             len = max(len1, len2);
  11.             if(len > maxLen){
  12.                 maxLen = len;
  13.                 start = i-(len-1)/2;
  14.             }
  15.         }
  16.         return s.substr(start, maxLen);
  17.     }
  18.    
  19.     int findLen(string s, int left, int right){
  20.         while(left>=0 && right < s.length() && s[left] == s[right]){
  21.             left--; right++;
  22.         }
  23.         return right-left-1;
  24.     }
  25. };
  26.  
  27. ---------------------
  28. O(n^2) solution
  29.  
  30. class Solution {
  31. public:
  32.     string longestPalindrome(string s) {
  33.         int n = s.length();
  34.         vector<vector<int>> dp(n+2, vector<int>(n+2));
  35.        
  36.         // Single char are palindrome.
  37.         for(int i=1; i<=n; i++)
  38.             dp[i][i] = 1;
  39.        
  40.         // Palindromes of length 2.
  41.         for(int i=1; i<n; i++)
  42.             if(s[i-1] == s[i])
  43.                 dp[i][i+1] = 1;
  44.    
  45.         // MCM logic...
  46.         int maxLen = 0, start=0;
  47.         for(int i=1; i<=n; i++){
  48.             for(int j=1; j<=n-i+1; j++){
  49.                 int k = j+i-1;
  50.                 if(s[j-1] == s[k-1] && dp[j+1][k-1])
  51.                     dp[j][k] = 1;
  52.                 if(dp[j][k] && k-j+1>maxLen){
  53.                     maxLen = k-j+1;
  54.                     start = j-1;
  55.                 }
  56.             }
  57.         }
  58.         return s.substr(start, maxLen);
  59.     }
  60. };
  61.  
  62. -----------------
  63. O(n) solution.
  64.  
  65. class Solution {
  66. public:
  67.     string longestPalindrome(string s1) {
  68.         int n = s1.length();
  69.         string s="#";
  70.         for(int i=0; i<n; i++){
  71.             s += s1[i];
  72.             s += "#";
  73.         }
  74.        
  75.         n = s.length();
  76.         vector<int> d1(n);
  77.         int maxLen = 0, start=0;
  78.         for(int i = 0, l = 0, r = -1; i < n; i++) {
  79.             int k = (i > r) ? 1 : min(d1[l + r - i], r - i + 1);
  80.             while(0 <= i - k && i + k < n && s[i - k] == s[i + k]) {
  81.                 k++;
  82.             }
  83.             d1[i] = k--;
  84.             if(i + k > r) {
  85.                 l = i - k;
  86.                 r = i + k;
  87.             }
  88.             if(d1[i] > maxLen){
  89.                 maxLen = d1[i];
  90.                 start = i-d1[i]+1;
  91.             }
  92.         }
  93.         string ans = "";
  94.         for(int i=start; i<start+2*maxLen-1; i++)
  95.             if(s[i] != '#')
  96.                 ans += s[i];
  97.         return ans;
  98.     }
  99. };
  100.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement