马拉车求最大回文字串

改进的代码 (输入字符串为s):

int getLongestPalindrome(string s) {

  string str;

  str.push_back(‘&‘);

  for (char item : s) {

    str.push_back(‘#‘);

    str.push_back(item);

  }

  str.push_back(‘#‘);

  str.push_back(‘$‘);

  int pos = 0;

  vector<int> len(str.size(), 0);

  for (int i = 0; i < str.size(); i++) {

    if (i <= pos+len[pos])

      len[i] = min(len[2*pos-i], pos+len[pos]-i);

    while (str[i-len[i]-1] == str[i+len[i]+1] )

      len[i]++;

  if (i+len[i] > pos+len[pos])

    pos = i;

  }

  return *(max_element(len.begin(), len.end()));

}

Reference:

[1] http://blog.csdn.net/dyx404514/article/details/42061017

时间: 2024-11-10 17:58:43

马拉车求最大回文字串的相关文章

最长回文字串理解(学习Manacher&#39;s algorithm)

关于字符串的子串问题,我们经常需要利用的是已经访问的部分的信息,来降低复杂度,和提高效率:在求最长回文子串的问题中,Manacher's algorithm提供了一种很好的机制,虽然部分地方不太容易理解 先说下核心的思想:先对原字符串进行预处理,将字符串"abc"转换为"$#a#b#c#"的形式,既避免了访问越界的问题,又保证每一个字符有至少一个对称的串(真字符,或是假的“#”) 预留两对变量(当前得到的中心位置“center”,和字符串右侧最远位置“R”,以及对称

Hdu 3068 最长回文字串Manacher算法

题目链接 最长回文 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 7976    Accepted Submission(s): 2735 Problem Description 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度.回文就是正反读都是一样的字符串,如aba, abba等 Input 输入

P1435 回文字串

P1435 回文字串 题目背景 IOI2000第一题 题目描述 回文词是一种对称的字符串.任意给定一个字符串,通过插入若干字符,都可以变成回文词.此题的任务是,求出将给定字符串变成回文词所需要插入的最少字符数. 比如 "Ab3bd"插入2个字符后可以变成回文词"dAb3bAd"或"Adb3bdA",但是插入少于2个的字符无法变成回文词. 注:此问题区分大小写 输入输出格式 输入格式: 一个字符串(0<strlen<=1000) 输出格

2238&quot;回文字串&quot;报告

题目描述: 回文串,就是从前往后和从后往前看都是一样的字符串.那么现在给你一个字符串,请你找出该字符串中,长度最大的一个回文子串. 输入描述: 有且仅有一个仅包含小写字母的字符串,保证其长度不超过5000 输出描述: 有且仅有一个正整数,表示最长回文子串的长度 输入样例: abccbxyz 输出样例: 4 分析: 我的算法算是比较暴力的.这道题目中,需要输出最长的回文字串的长度,我的想法是从最长的长度开始寻找是否有回文字串符合这个长度,如果没有,则从次长的长度寻找是否有符合长度的回文字串.比如说

最长回文字串 (The longest palindrome substring)

这两天去学了一下,觉得下面那篇文章写的很好,有例子,比较容易懂,所以转一下. 以下内容来自:hihoCoder: 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在编程的学习道路上一同前进. 这一天,他们遇到了一连串的字符串,于是小Hi就向小Ho提出了那个经典的问题:“小Ho,你能不能分别在这些字符串中找到它们每一个的最长回文子串呢?” 小Ho奇怪的问道:“什么叫做最长回文子串呢?” 小Hi回答道:“一个字符串中连续的一段就是这个字符串的子串,而回文

ural 1297 O(nlogn) 后缀数组求最长回文字串

把原串复制一份反过来接在原串后面,中间用没出现过的字符隔开,然后跑后缀数组,在原创枚举每一个位为回文中心(分奇偶讨论),则回文串长度相当于原串与反串对应位置的lcp,所以先用ST预处理,然后查询.复杂度O(nlogn) #include<iostream> #include<cstring> #include<set> #include<map> #include<cmath> #include<stack> #include<

求最长回文字串

题目: 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: "babad" 输出: "bab" 注意: "aba" 也是一个有效答案. 示例 2: 输入: "cbbd" 输出: "bb" 知道题网上有很多种解法,比如Manacher算法就是专门解决知道题的,还有中心扩散法,小编比较水就给大家讲讲动态规划吧! dp的话,主要就是推出dp方程:以上是具体

URAL 1297. Palindrome(后缀数组求最大回文串)

题目大意:给你一串字符串,让你求出来它存在的最长连续的回文串. 解题思路:先把字符串逆序加到数组中,然后用后缀数组求解.两种方法:1,枚举排名,直接比较rank相同的字符串的位置差是不是len.如果是的话,就记录求解:2,枚举地址,求第i地址与第2*len-i+1的lcp的最大值. PS:需要注意如果多解输出靠前的字符串. 两种写法写在了一起,分别是Del,和Del1函数. 1297. Palindrome Time limit: 1.0 second Memory limit: 64 MB T

最长回文字串

区别于最长公共字串,下面是最长公共字串的算法,利用DP(动态规划): void LCS_dp(char * X, int xlen, char * Y, int ylen) { maxlen = maxindex = 0; for(int i = 0; i < xlen; ++i) { for(int j = 0; j < ylen; ++j) { if(X[i] == Y[j]) { if(i && j) { dp[i][j] = dp[i-1][j-1] + 1; } if