您的位置:首页 > 其它

[*leetcode 5] Longest Palindromic Substring

2015-01-06 22:21 323 查看
Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring.

[Solution]

求最长回文子串,假设我们已知S[i...j]是回文子串,那么,若S[i-1] = S[j+1],则S[i-1,...,j+1]是回文子串。

1、双指针法

用middle顺序指向S中的字符,如果S[left] == S[right], 那么left和right分别向两边扩展。

string longestPalindrome(string s)
{
int left = 0, right = 0, middle = 0, slen = s.size();
string result = "";

while (middle < slen)
{
left = right = middle;
while ((left > 0) && (s[left - 1] == s[middle]))
left--;
while ((right < slen - 1) && (s[right + 1] == s[middle]))
right++;
while ((left > 0) && (right < slen - 1) && (s[left - 1] == s[right + 1]))
left--, right++;

if (result.size() < (right - left + 1))
result = s.substr(left, right - left + 1);
middle++;
}

return result;
}


2、动态规划

用table[i][j]的true/false表示S[i,...,j]是否为回文子串,

可以得到递推公式:table[i][j] = table[i+1][j-1] && (S[i] == S[j]) (i+1 <= j-1, 即 i+2 <= j)

初始条件:

当j = i 时,table[i][j] = true;

当j = i + 1时,table[i][j] = (S[i] == S[j])

string longestPalindrome(string s)
{
bool table[1000][1000] = {false};
int i, j, slen = s.length(), start = 0, maxlen = 1;

for (i = 0; i < slen; i++)
table[i][i] = true;
for (i = 0; i < slen - 1; i++)
{
j = i + 1;
if (s[i] == s[j])
{
table[i][j] = true;
start = i;
maxlen = 2;
}
}

for (int len = 3; len <= slen; len++)
{
for (i = 0; i < slen - len + 1; i++)
{
j = i + len - 1;
if (s[i] == s[j] && table[i + 1][j - 1])
{
table[i][j] = true;
start = i;
maxlen = len;
}
}
}

return s.substr(start, maxlen);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: