zoukankan      html  css  js  c++  java
  • Manacher's Algorithm

     1 string longestPalinderome(string s) {
     2     int N = s.size();
     3     int id = 0, mx = 0;
     4     vector<int> dp(2 * N + 1);
     5     for (int i = 0; i < 2 * N + 1; ++i) {
     6         int j = 2 * id - i;
     7         if (mx > i) {
     8             dp[i] = min(mx - i, dp[j]);
     9         }
    10         int left = i - dp[i], right = i + dp[i];
    11         for (; left >= 0 && right <= 2 * N; --left, ++right) {
    12             if ((left & 1) == 0 || s[left / 2] == s[right / 2]) {
    13                 ++dp[i];
    14             }
    15             else 
    16                 break;
    17         }
    18         if (dp[i] + i > mx) {
    19             id = i;
    20             mx = dp[i] + i;
    21         }
    22     }
    23     int res = 0;
    24     for (int i = 0; i < 2 * N + 1; ++i) {
    25         if (dp[i] > dp[res])
    26             res = i;
    27     }
    28     return s.substr(res / 2 - (dp[res] - 1) / 2, dp[res] - 1);
    29 }
  • 相关阅读:
    Best Time to Buy and Sell Stock II
    Subsets II
    Subsets I
    Combinations
    Permutation Sequence
    Next Permutation
    Anagrams
    Combination-Sum II
    Combination-Sum I
    Permutations II
  • 原文地址:https://www.cnblogs.com/chasuner/p/manacher.html
Copyright © 2011-2022 走看看