Advertisement
Taraxacum

Longest Palindromic Substring

Nov 12th, 2018
231
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.62 KB | None | 0 0
  1. #include <cstring>
  2. #include <iostream>
  3.  
  4. using namespace std;
  5.  
  6. const int MAX_SIZE = 2048;
  7.  
  8. struct SubString {
  9.     int start;
  10.     int length;
  11. };
  12.  
  13. SubString longestPalindrome(char* s)
  14. {
  15.     int length = strlen(s);
  16.  
  17.     if (length == 0) {
  18.         return { 0, 0 };
  19.     } else if (length == 1) {
  20.         return { 0, 1 };
  21.     } else {
  22.         int max_len = 0, max_i = 0;
  23.         int mid = 0, len, lh, rh;
  24.         while (mid < length && length - mid >= max_len / 2) {
  25.             len = 1;
  26.             lh = mid - 1;
  27.             rh = mid + 1;
  28.             while (lh >= 0 && rh < length && s[lh] == s[rh]) {
  29.                 lh--;
  30.                 rh++;
  31.                 len += 2;
  32.             }
  33.  
  34.             if (len > max_len) {
  35.                 max_len = len;
  36.                 max_i = lh;
  37.             }
  38.  
  39.             if (++mid < length && s[mid - 1] == s[mid]) {
  40.                 lh = mid - 2;
  41.                 rh = mid + 1;
  42.                 len = 2;
  43.                 while (lh >= 0 && rh < length && s[lh] == s[rh]) {
  44.                     lh--;
  45.                     rh++;
  46.                     len += 2;
  47.                 }
  48.                 if (len > max_len) {
  49.                     max_len = len;
  50.                     max_i = lh;
  51.                 }
  52.             }
  53.         }
  54.  
  55.         return { max_i + 1, max_len };
  56.     }
  57. }
  58.  
  59. int main()
  60. {
  61.     char str[MAX_SIZE];
  62.  
  63.     cout << "input please: " << endl;
  64.     cin.getline(str, MAX_SIZE);
  65.  
  66.     SubString ss = longestPalindrome(str);
  67.  
  68.     cout << ss.length << endl;
  69.     for (int i = ss.start; i < ss.start + ss.length; i++) {
  70.         cout << str[i];
  71.     }
  72.     cout << endl;
  73. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement