longest_plalindrome

O(n)的算法

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;

int LongestPlalindrome(const string& str) {
  if (str.empty()) return 0;
  string recombined_str;
  max_len = 1;
  recombined_str.resize(2 * str.size() - 1);
  for (int i = 0; i < str.size() - 1; ++i) {
    recombined_str[2*i] = str[i];
    recombined_str[2*i + 1] = '#';
  } 
  vector<int> pld_len;
  pld_len.resize(recombined_str.size(), 1);
  int farrest_match = 0;
  int match_pos = 0;
  for (int i = 1; i < recombined_str.size(); ++i) {
    if (farrest_match > i) {
      pld_len[i] = min(pld_len(2 * match_pos - i), farrest_match - i);
    } 
    int len = pld_len[i];
    while (i - len >= 0 && i + len <= recombined_str.size() - 1 &&
        recombined_str[i - len] == recombined_str[i + len]) {
      ++len;
      pld_len[i]++;
      farrest_match++;
      match_pos = i;
    }
    max_len = max(max_len, pld_len[i]);
  }
  return max_len;
}

 

posted @ 2013-09-15 22:43  dmthinker  阅读(153)  评论(0)    收藏  举报