Skip to content

Commit 6670a40

Browse files
committed
add longest palindromic subsequence
1 parent 2ac3137 commit 6670a40

File tree

1 file changed

+65
-0
lines changed

1 file changed

+65
-0
lines changed
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
// longest palindromic subsequence
2+
// http://www.geeksforgeeks.org/dynamic-programming-set-12-longest-palindromic-subsequence/
3+
4+
package longestPalindromicSubsequence
5+
6+
// package main
7+
8+
import "fmt"
9+
10+
func max(a, b int) int {
11+
if a > b {
12+
return a
13+
}
14+
return b
15+
}
16+
17+
func lpsRec(word string, i, j int) int {
18+
if i == j {
19+
return 1
20+
}
21+
if i > j {
22+
return 0
23+
}
24+
if word[i] == word[j] {
25+
return 2 + lpsRec(word, i+1, j-1)
26+
}
27+
return max(lpsRec(word, i, j-1), lpsRec(word, i+1, j))
28+
}
29+
30+
func lpsDp(word string) int {
31+
N := len(word)
32+
dp := make([][]int, N)
33+
34+
for i := 0; i < N; i++ {
35+
dp[i] = make([]int, N)
36+
dp[i][i] = 1
37+
}
38+
39+
for l := 2; l <= N; l++ {
40+
// for length l
41+
for i := 0; i < N-l+1; i++ {
42+
j := i + l - 1
43+
if word[i] == word[j] {
44+
if l == 2 {
45+
dp[i][j] = 2
46+
} else {
47+
dp[i][j] = 2 + dp[i+1][j-1]
48+
}
49+
} else {
50+
dp[i][j] = max(dp[i+1][j], dp[i][j-1])
51+
}
52+
}
53+
}
54+
55+
return dp[1][N-1]
56+
}
57+
58+
/*
59+
func main() {
60+
// word := "aaabbbbababbabbabbabf"
61+
word := "aaaabbbba"
62+
fmt.Printf("%d\n", lpsRec(word, 0, len(word)-1))
63+
fmt.Printf("%d\n", lpsDp(word))
64+
}
65+
*/

0 commit comments

Comments
 (0)