您的位置:首页 > 其它

最长回文子串 leetcode 05 DP解法

2015-01-26 14:44 399 查看
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">找出最长回文子串,马上想到了用DP,用 dp[ i ][ j ] = 1表示s[ i ]----s[ j ]是一个回文串  dp[ i ][ j ] = 0就表示s[ i ]---[ j ]为非回文,方程可以表示为 </span>

if(s[ i ]==s[ j ]) dp[ i ][ j ] = dp[ i+1 ][ j-1 ],其实也可以明确为,前一个子串是回文串的,当前才继续做判断,否则直接不管,可以细化为
if(s[ i ]==s[ j ] && dp[ i+1 ][ j-1 ] == 1) dp[ i ][ j ] = 1; 之后记录此时的长度和起点,下面是代码

class Solution {
public:
string longestPalindrome(string s) {
int judge[1000][1000] = {0};
int start = 0;
int maxLength = 1;
for(int i=0;i<s.length();i++)
{
judge[i][i] = 1;
}

for(int i=0;i<s.length()-1;i++)
{
if(s[i] == s[i+1])
{
judge[i][i+1] = 1;
maxLength = 2;
start = i;
}
}

for(int tempLen=3;tempLen<=s.length();tempLen++)
{
for(int i=0;i<s.length()-tempLen+1;i++)
{
int j=i+tempLen-1;
if(s[i]==s[j] && judge[i+1][j-1] == 1)
{
judge[i][j] = 1;
maxLength = tempLen;
start = i;
}
}
}
return s.substr(start,maxLength);
}
};
跟之前java不同的是,C++的字符串可以直接取下标,方便了不少,还有substr函数,参数分别是起点和长度,而不是起点和终点的下标。DP开始之前,可以先做初始化,因为每个字符自己本身是一个长度为1的回文串,还有i到i+1长度为2的子串要是是回文串的话必须是两个一样的字符,做完初始化之后可以开始做DP。时间复杂度为O(N^2),略慢,之后再研究一下传说中复杂度为O(N)的好方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: