leetcode-回文字符串(马拉车算法模板)

it2026-08-06  14

马拉车算法

由于看了一个巨巨的博客深受启发。所以不再赘述。

巨巨的博客

leetcode-最长回文字符串:

给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。

示例 1:

输入: “babad” 输出: “bab” 注意: “aba” 也是一个有效答案。 示例 2:

输入: “cbbd” 输出: “bb”

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/longest-palindromic-substring 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 原题链接

解题思想:

看懂马拉车即可

AC代码:

class Solution { public: void init(string s,string &des) { int len=s.length(); for(int i=0;i<len;i++) { des+='#'; des+=s[i]; } des+="#"; } string sol(string s,string pre) { int len=s.length(); int id; int mx=0; int p[10000]={0}; int maxlength=-1; int index=-1; for(int i=1;i<len-1;i++) { if(i<mx) { p[i]=min(p[2*id-i],mx-i); } else{ p[i]=1; } while(s[i+p[i]]==s[i-p[i]]) { p[i]++; } if(p[i]+i>mx) { mx=p[i]+i; id=i; } if(p[i]-1>maxlength) { maxlength=p[i]-1; index=i; } } string ans=""; int start=(index-maxlength-1)/2;//这里和巨巨的模板代码不同,多减了一个1但是和巨巨博客中相同 for(int i=start;i<start+maxlength;i++) { ans+=pre[i]; } return ans; } string longestPalindrome(string s) { if(s.length()<2) { return s; } string des="$"; init(s,des); return sol(des,s); } };

总结:

主要是为了留一下巨巨的博客(Orz)

最新回复(0)