LeetCode: Longest Palindromic Substring
来源:互联网 发布:mac修容粉怎么用 编辑:程序博客网 时间:2024/06/18 17:32
Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.
Example:Input: "babad"Output: "bab"
Note: “aba” is also a valid answer.
Example:
Input: "cbbd"Output: "bb"
最长回文串
思路:Manacher算法
很明显最大的P[i]值减1即为最长的回文字符串长度。所以问题来了,怎么计算P这个数组是接下来的重点。
Manacher算法增加两个辅助变量mid和maxid,mid代表的是最长回文串的中心的位置,maxid是最长回文串的边界即mid+P[mid]。
Manacher算法有个很重要的结论:IF maxid>i, P[i]>=min(P[2*mid-i],maxid-i]
这个结论怎理解呢?
如下图,我们设置位置j为i关于mid的对称点,j=2*mid-i
当maxid-i>P[i]时,以位置i为中心的最长回文串和以j为中心的最长回文串是相同的。解释一下,因为以mid为中心的最长回文串的边界是maxid,则在maxid对称点和maxid之间的字符串是回文的,所以,以位置i为中心的最长回文串和以j为中心的最长回文串是相同的。即P[i]=P[j]。
当maxid-i<=P[i]时,直观上就是以位置i为中心的最长回文串的边界超过了maxid。此时,只能在超出maxid边界继续匹配。
当maxid<=i时,直接令P[i]=1,继续匹配。
困了,代码稍晚贴出来,晚安。
关于代码我说一下,用的例子是leetcode的,在sublime上调试结果是wyyw,但在leetcode平台上是eiee,该题目在leetcode平台一共有94个test,通过了93个,第94个见鬼了,两个平台不一样。如果你发现为什么两个平台不一样,私信我。日了狗了。。。截图如下:
#include <iostream>#include "string"#include "algorithm"#include "vector"using namespace std;class Solution {public: string longestPalindrome(string s) { string str=""; int length=s.size(); if(length<=1) return s; for(int i=0;i<length;i++) { str+="#"; str+=s[i]; } str+="#"; return manacher(str,s); } string manacher(string str,string s);};string Solution::manacher(string str,string s){ int mid=0,maxid=0; int length=str.size(); vector<int> P(length,0); for(int i=0;i<length;i++) { if(maxid>i) { P[i]=min(P[2*mid-1],maxid-i); } else{ P[i]=1; } while(i-P[i]>=0&&i+P[i]<=length&&str[i+P[i]]==str[i-P[i]]) { P[i]++; } if(maxid<P[i]+i) { maxid=i+P[i]; mid=i; } } int max=0,index=0; for(int i=0;i<length;i++) { if(max<=P[i]) { index=i; max=P[i]; } } string subStr=""; if(index%2==1) { subStr=s.substr(index/2-(max-1)/2,max-1); } else{ subStr=s.substr(index/2-max/2,max-1); } return subStr;}int main(){ string str="apqjpwedlhmvvpexxnntxheeynxmgzwxhnhfdvziuxnuusymklgcacndoyhqkoahnkyaikohwkmnuphipftmzmihvmoetskioeypwjujvvusaxynzxxdugnebsisrtgeujkqkgwjuplijhluumqcdurovyjsbowmnqndejwkihzbbdyxjunkduyqeihektaknbmkzgnnmgywylulxwyywrvieqfenjeljofkqqqisdjsbfkvqgahxwkfkcucvrbbpyhwkfztjdboavtfynrudneieelwlcezqsuhmllcsadcnoyemsfdlrijoyj"; int len=str.size(); Solution sol; string str1=sol.longestPalindrome(str); for(int i=0;i<str1.length();i++) { cout<<str1[i]; } return 0;}
阅读全文
0 0
- LeetCode: Longest Palindromic Substring
- LeetCode Longest Palindromic Substring
- LeetCode: Longest Palindromic Substring
- [Leetcode] Longest Palindromic Substring
- [LeetCode] Longest Palindromic Substring
- Leetcode : Longest Palindromic Substring
- [LeetCode]Longest Palindromic Substring
- leetcode Longest Palindromic Substring
- LeetCode-Longest Palindromic Substring
- [LeetCode] Longest Palindromic Substring
- Longest Palindromic Substring leetcode
- LeetCode Longest Palindromic Substring
- LeetCode - Longest Palindromic Substring
- LeetCode -- Longest Palindromic Substring
- LeetCode | Longest Palindromic Substring
- LeetCode: Longest Palindromic Substring
- [LeetCode]Longest Palindromic Substring
- leetcode Longest Palindromic Substring
- AVL平衡树的旋转
- 个人学习总结一机器学习入门(七)
- UVa 11729 Commando War——贪心
- 23种设计模式~模板方法的设计模式
- js---全面正则表达式语法,常用正则检查表达式手机号email地址url检查
- LeetCode: Longest Palindromic Substring
- MFC控件之Button基本用法 (动、静态按钮)
- Java合并数组的两种实现方式
- Codeforces 797A k-Factorization
- CXF 开源的WebService框架
- 让AndroidStudio提示的时候大小写不敏感
- HTML 5 发展历史
- Web Service相关概念介绍
- USACO-Section1.1 Broken Necklace