longest palindromic substring

27
Longest Palindromic Substring Yang Liu

Upload: yaron

Post on 23-Feb-2016

101 views

Category:

Documents


1 download

DESCRIPTION

Longest Palindromic Substring. Yang Liu. Problem. Given a string S Find the longest palindromic substring in S. Example: S=“ abcbcbb ”. The longest palindromic substring is “ bcbcb ”. Simple Idea(Brute Force). S=“ abcbcbb ”. Length= n(6) substring: “ abcbcbb ”---not palindromic. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Longest  Palindromic  Substring

Longest Palindromic Substring

Yang Liu

Page 2: Longest  Palindromic  Substring

Problem

• Given a string S• Find the longest palindromic substring in S.

Example:S=“abcbcbb”. The longest palindromic substring

is “bcbcb”.

Page 3: Longest  Palindromic  Substring

Simple Idea(Brute Force)S=“abcbcbb”Length=n(6) substring: “abcbcbb”---not palindromicLength=n-1(5) substring: start=0, end=n-2(4): “abcbc”---not palindromic start=1, end=n-1(5): “bcbcb”---palindromic

Longest palindromic substring: “bcbcb”

Page 4: Longest  Palindromic  Substring

Simple Idea(Brute Force)

For len=n to 2 for start=0 to n-len end= start+len-1 if substring(start,end) is palindromic return substring(start,end)Return first character

2

nlen

lenn

start 0

len

2

3

0

2

)()1(nlen

lenn

startnlen

nOlenlennlenComplexity

Page 5: Longest  Palindromic  Substring

Dynamic Programming(DP)

• If substring(i,j) is palindromic, then substring(i+1,j-1) is palindormic• P[i,j]=1 if substring(I,j) is palindormic =0 otherwise• When j-i is small(=0, 1), easy to know: P[i,i]=1 and P[i,i+1]=(S[i]==S[j]) (base)• Computer P[i,j] from small j-i to big j-i: P[i,j]=P[i+1,j-1] && S[i]==S[j]

Page 6: Longest  Palindromic  Substring

Example of DPS=“abcbcbb”

1

1

1

1

1

1

1

P[i,i]

Page 7: Longest  Palindromic  Substring

Example of DPS=“abcbcbb”

1 0

1 0

1 0

1 0

1 0

1 1

1

P[i,i]

P[i,i+1]

Page 8: Longest  Palindromic  Substring

Example of DPS=“abcbcbb”

1 0 0 0

1 0 1 0

1 0 1 0

1 0 1 0

1 0 0

1 1

1

P[i,i]

P[i,i+1]

P[i,i+2]

P[i,i+3]

Page 9: Longest  Palindromic  Substring

Example of DPS=“abcbcbb”

1 0 0 0 0 0 0

1 0 1 0 1 1

1 0 1 0 0

1 0 1 0

1 0 0

1 1

1

P[i,i]

P[i,i+1]

P[i,i+2]

P[i,i+3]

.

.

.

Page 10: Longest  Palindromic  Substring

Example of DPS=“abcbcbb”

1 0 0 0 0 0 0

1 0 1 0 1 1

1 0 1 0 0

1 0 1 0

1 0 0

1 1

1

P[i,i]

P[i,i+1]

P[i,i+2]

P[i,i+3]

.

.

.

Max palindromic substring?

for(len=n to 1) for(i=0 to n-len) if (P[i,i+len-1]) return S[i..i+len-1]

Page 11: Longest  Palindromic  Substring

DP Algorithmfor(i=0 to n-1) P[i,i]=1; P[i,i+1]=(S[i]==S[i+1])?1:0;for(len=3 to n) for(i=1 to n-len+1) P[i,i+len-1]=(P[i+1,i+len-2] && S[i]==S[i+len])?1:0

for(len=n to 1) for(i=0 to n-len) if (P[i,i+len-1]) return S[i..i+len-1]

O(n2) time and space

Page 12: Longest  Palindromic  Substring

Algorithm of O(1) Space and O(n2) time

• Given the center of a palindrome, easy to find the maximum substring with that center center at i: check S[i-dist]==S[i+dist]

S=“abcbcbb” center at 2(c) S[2-1]=S[2++1]=b continue

S[2-2]!=S[2+2] stop center at i,i+1: check S[i-dist]==S[i+1+dist]

• Do this for all possible centers(n+n-1=2n-1)

Page 13: Longest  Palindromic  Substring

Linear Time Algorithm

• The previous algorithm simply computes:– an array P[1..n-1] where P[i] is the length of

maximum substring centered at i.– an array Q[1..n-2] where Q[i] is the length of

maximum substring centered at i and i+1.• Can we reduce the time to compute P[i] & Q[i]

by using already computed P[j] & Q[j] (j<i)?

Page 14: Longest  Palindromic  Substring

Compute P[i] & Q[i] Efficiently

S=“abbabbabbabbabbaba”• “abbabbabbabbabbaba” P[6]=12• “abbabbabbabbabbaba” Q[7]=16P[7]? Q[7]? “abbabbabbabbababa” Shall we compare S[8] & S[10]? “abbabbabbabbababa” No! its image P[2] W.R.T S[7] and

the rightmost edge of P[7] provide a lower bound. Similarly, “abbabbabbabbabbaba” implies a lower bound

from P[6] and the rightmost edge of Q[7]

Page 15: Longest  Palindromic  Substring

Lower Bound of P[i]

• Depends on the rightmost edge of paralindromic substrings and the image of S[i] in the substring.

• Rightmost edge: rEdge• Image: depends on the length of the substring

can we make the length of paralindromic substrings to be always odd?

Page 16: Longest  Palindromic  Substring

Length Change of Paralindromic Substrings

• Insert a special character between any adjacent characters in the input string

o S =“abcbcbb” S=“#a#b#c#b#c#b#b”o S=“abccbab” S=“#a#b#c#c#b#a#b”

Page 17: Longest  Palindromic  Substring

Center, Image, and Rightmost Edge

• “abbabbabbabbabbaba” P[19]=? center rEdge=26 =13“#a#b#b#a#b#b#a#b#b#a#b#b#a#b#b#a#b#a” image=2*13-19=7 P[7]=13 P[19]>=P[7]=13

Page 18: Longest  Palindromic  Substring

Center, Image, and Rightmost Edge

• “aababbabbabaaaba” P[19]=? center rEdge=28 =15“#a#a#b#a#b#b#a#b#b#a#b#a#a#a#b#a” image=2*15-19=7 P[7]=7 P[21]>=P[7]=7

Page 19: Longest  Palindromic  Substring

Center, Image, and Rightmost Edge

• “babbabbabbabbaaaba” P[21]=12 center rEdge=28 =15“#b#a#b#b#a#b#b#a#b#b#a#b#b#a#a#b#a#b#a” image=2*15-21=9 P[9]=19 P[21]>=2(rEdge-i)-1

=2(28-21)-1=13

Page 20: Longest  Palindromic  Substring

Center, Image, and Rightmost Edge

• “babbabbabbabbaaaba” P[21]=12 center rEdge=28 =15“#b#a#b#b#a#b#b#a#b#b#a#b#b#a#a#b#a#b#a

” In general, paralindromic substring centered at i can be extended to one side at least min(P[i], rEdge-i) (P[i] now refers to the maximum characters in one side including the center character at i)

Page 21: Longest  Palindromic  Substring

Center, Image, and Rightmost Edge

• “abbabbabbabbabbaba” P[19]=? center rEdge=26 =13“#a#b#b#a#b#b#a#b#b#a#b#b#a#b#b#a#b#a” image=2*13-19=7 P[7]=7 P[19]>=min(P[7],26-19)=7

Page 22: Longest  Palindromic  Substring

Center, Image, and Rightmost Edge

• “aababbabbabaaaba” P[19]=? center rEdge=28 =13“#a#a#b#a#b#b#a#b#b#a#b#a#a#a#b#a” image=2*13-19=7 P[7]=3 P[21]>=min(P[7],28-)=

Page 23: Longest  Palindromic  Substring

Center, Image, and Rightmost Edge

• “babbabbabbabbaaaba” P[21]=12 center rEdge=28 =15“#b#a#b#b#a#b#b#a#b#b#a#b#b#a#a#b#a#b#a

” image=2*15-21=9 P[9]=10 P[21]>=min(P[9],28-21+1)=8

Page 24: Longest  Palindromic  Substring

O(n) AlgorithmFor(i=1 to n-1) insert special character before A[i]center=0;rEdge=0;For(i=1 to 2n-1) image=2*center-i; P[i]=min(P[image],rEdge-i+1); extend P[i] to its maximum; if(P[i]+i>rEdge) rEdge=P[i]+I; center=i;Find the maximum P[i] for i in 1, 3, …, 2n-1.Return the substring centered at i with 2P[i]-1 characters.

Why the complexity is O(n)?

Page 25: Longest  Palindromic  Substring

Exercise 1

• Find one of the longest paralindromic subsequences.

Example:S=“abbbcccabaa”Longest paralindormic subsequenc: “abccba”

from “abbbcccabaa”

Page 26: Longest  Palindromic  Substring

Exercise 2

Determine whether an integer is a palindrome. Do this without extra space.

Page 27: Longest  Palindromic  Substring

Research Reference

“A New Linear-Time ‘On-Line’ Algorithm for finding the smallest initial palindrome of a string”, G. Manacher, JACM 22(3):346-351, 1975.