通过动态编程找到最长的子串

时间:2015-03-15 00:43:54

标签: algorithm dynamic-programming

回文是一个与其反向相同的字符串。以下字符串是回文的示例:abba,refer,0101010,x。字符串X = x1, x2, x3, . . . , xn的子字符串是字符串Y = y1, y2, . . . , yk,使y1 = xi1 , y2 = xi2 , . . . , yk = xik and i1 < i2 < . . . ik

例如,2,7,4是子串1,2,8,7,4。设计最有效的动态编程算法,您可以输入长度为n的字符串X并找到最长的字符串X的子串,是回文。这个问题可以在O(n ^ 2)时间内解决吗?

1 个答案:

答案 0 :(得分:1)

这是子字符串。 但您的问题中的示例表明了后续行为。 O(n ^ 2)解决方案将是这样的 - len(l,r) - x [l..r]的最长回文子串的长度。

for i=1 to n
 for j=1 to n
  if(i=j) 
    len(i,j)=1       //1-length palindromes
  if(i+1=j)
     then len(i,j)=2 if (x[l]=x[r]),or 1 otherwise //for even-length palindrome. 
  if(x[l]=x[r]) 
     then len(i,j)=2+len(i+1,j-1) //both character same
  else
     len(l,r)=maximum(len(l,r-1),len(l+1,r)); //increase left,decrease right

答案是len(1,n),它将在O(n ^ 2)时间内找到。