最长回文子串 leetcode 05 DP解法

<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)的好方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值