Download presentation
Presentation is loading. Please wait.
Published byWendy Robertson Modified over 8 years ago
1
Longest Palindromic Substring Yang Liu
2
Problem Given a string S Find the longest palindromic substring in S. Example: S=“abcbcbb”. The longest palindromic substring is “bcbcb”.
3
Simple Idea(Brute Force) S=“abcbcbb” Length=n(6) substring: “abcbcbb”---not palindromic Length=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”
4
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 Complexity
5
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]
6
Example of DP S=“abcbcbb” 1 1 1 1 1 1 1 P[i,i]
7
Example of DP S=“abcbcbb” 10 10 10 10 10 11 1 P[i,i] P[i,i+1]
8
Example of DP S=“abcbcbb” 1000 1010 1010 1010 100 11 1 P[i,i] P[i,i+1] P[i,i+2] P[i,i+3]
9
Example of DP S=“abcbcbb” 1000000 101011 10100 1010 100 11 1 P[i,i] P[i,i+1] P[i,i+2] P[i,i+3]......
10
Example of DP S=“abcbcbb” 1000000 101011 10100 1010 100 11 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]
11
DP Algorithm for(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(n 2 ) time and space
12
Algorithm of O(1) Space and O(n 2 ) 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)
13
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)?
14
Compute P[i] & Q[i] Efficiently S=“abbabbabbabbabbaba” “abbabbabbabbabbaba” P[6]=12 “abbabbabbabbabbaba” Q[7]=16 P[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]
15
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?
16
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”
17
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
18
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
19
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
20
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)
21
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
22
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-)=
23
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
24
O(n) Algorithm For(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)?
25
Exercise 1 Find one of the longest paralindromic subsequences. Example: S=“abbbcccabaa” Longest paralindormic subsequenc: “abccba” from “abbbcccabaa”
26
Exercise 2 Determine whether an integer is a palindrome. Do this without extra space.
27
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.
Similar presentations
© 2024 SlidePlayer.com Inc.
All rights reserved.