LeetCode5 Longest Palindromic Substring

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”
解析:
最长回文问题,给定字符返回最长的回文字符,如给定字符串”babad”,返回”bab”,以a为中心左右对称。
方案1:
暴力求解,直接挨个遍历处理,时间复杂度为\(O(n^3)\)。没啥可解释的,直接上代码。
[cc lang=”C++”]
bool isValid(string s, int left, int right)
{
while(left < right) { if(s[left] == s[right]) { left ++; right --; }else { return false; } } return true; } string longestPalindrome(string s) { int len = s.length(); if(len == 0) { return ""; } int max_len = 0; int global_left = 0; int global_right = 0; for(int i=0; i < len; i++)//字符结束位置 { for(int j=0; j< i;j++)//字符的起始位置 { int left = j; int right = i; if(isValid(s,j,i) && max_len < i-j+1) { global_left = j; global_right = i; max_len = i-j+1; } } } string result = s.substr(global_left, global_right - global_left+1); return result; } [/cc] 方案2: 中心扩散法,考虑回文的长度,如果回文长度为奇数,则以一个字符为中心,相互对称;如果回文长度为偶数,则最中心的两个元素相等,其余由内到外对称。所以考虑以一个中心元素往左右扩展,如"aaaa"。时间复杂度为[latex]O(n^2)[/latex] [cc lang="C++"] class Solution { public: string longestPalindrome(string s) { int len = s.length(); if(len <= 1) { return s; } int max_len = 0; int start =0; for(int index=1; index < len; index ++)//遍历每一个元素 { //以index为中心元素长度为奇数的回文 int low = index-1; int high = index + 1; while(low >=0 && high max_len)
{
max_len = high-low -1;
start = low + 1;
}
//以index-1,index为中心的长度为偶数的回文
low = index-1;
high = index;
while(low >=0 && high max_len)
{
max_len = high-low -1;
start = low + 1;
}
}
return s.substr(start, max_len);

}
};
[/cc]


方案3:
Manacher算法,时间复杂度O(n), 空间复杂度O(n)。
后续再补充。。。

参考:
http://www.cnblogs.com/TenosDoIt/p/3675788.html

Add a Comment

邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据