面试题 最长回文子串
2016-08-30 14:45
197 查看
求最长回文子串
方法:中心法,回文最重要的是确定中心。
start即是中心,left和right就是回文的左右边界。
若start右边有重复字母,让right一直延长到无重复,start直接从那边开始
然后就是回文判断。
这样大约是O(n)
string longestPalindrome(string s)
{
int i,n,start,left,right,max_len;
string ans_s;
n=s.length();
if(n<2)
return s;
start=0; //中心最开始为0
max_len=0; //最长子串长度为0
while(start<n && n-start>max_len/2 ) //若剩余长度小于max_len/2,那么肯定不会再有结果,因为他们都是中心!
{
left=right=start;
while(right+1<n&&s[right+1]==s[start]) //右方延伸到无重复地带
right++;
start=right+1;//下次检索中心跳过重复字母,从那个地方开始
while(left-1>=0&&right+1<n) //若left-1和right+1都在范围内
if(s[left-1]==s[right+1]) //判断是否相等,相等则再向两边延伸,否则退出
{
left--;
right++;
}
else break;
if(right-left+1>max_len) //判断长度
{
max_len=right-left+1;
ans_s=s.substr(left,right-left+1);
}
}
return ans_s;
}
方法:中心法,回文最重要的是确定中心。
start即是中心,left和right就是回文的左右边界。
若start右边有重复字母,让right一直延长到无重复,start直接从那边开始
然后就是回文判断。
这样大约是O(n)
string longestPalindrome(string s)
{
int i,n,start,left,right,max_len;
string ans_s;
n=s.length();
if(n<2)
return s;
start=0; //中心最开始为0
max_len=0; //最长子串长度为0
while(start<n && n-start>max_len/2 ) //若剩余长度小于max_len/2,那么肯定不会再有结果,因为他们都是中心!
{
left=right=start;
while(right+1<n&&s[right+1]==s[start]) //右方延伸到无重复地带
right++;
start=right+1;//下次检索中心跳过重复字母,从那个地方开始
while(left-1>=0&&right+1<n) //若left-1和right+1都在范围内
if(s[left-1]==s[right+1]) //判断是否相等,相等则再向两边延伸,否则退出
{
left--;
right++;
}
else break;
if(right-left+1>max_len) //判断长度
{
max_len=right-left+1;
ans_s=s.substr(left,right-left+1);
}
}
return ans_s;
}
相关文章推荐
- 面试题整理-线性时间求最长回文子串
- 【面试题】最长回文子串
- 【面试题之算法部分】最长回文子串
- 面试题:最长回文子串(即求对称字符串的最大长度 )
- 【LeetCode】Longest Palindromic Substring && 【九度】题目1528:最长回文子串(腾讯2013年实习生招聘二面面试题)
- 【面试题】最长回文子串
- PAT 1040 求最长回文子串
- 九章算法面试题34 最长01子串
- 最长回文子串(Manacher算法)
- 广师oj 2238 最长回文子串
- 求最长回文子串(一)
- O(n) 求 最长回文子串
- hihocoder 1032 最长回文子串 (Manacher算法 详解+模板)
- 最长回文子串(2013华科机试)
- 最长回文子串 Manacher算法 时间复杂度O(N)
- [bzoj2565]最长双回文子串
- 最长回文子串
- 《编程之法》1.6最长回文子串
- CSU 1328 近似回文词(最长回文子串变形)
- NYOJ 132(最长回文子串)