最长回文子串 leetcode 05 DP解法

来源:互联网 发布:lol有mac国服版本吗 编辑:程序博客网 时间:2024/06/04 18:19
<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
原创粉丝点击