1+ package DynamicProgramming ;
2+ import java .lang .*;
3+ import java .io .*;
4+ import java .util .*;
5+
6+ /**
7+ * @author Matteo Messmer https://github.com/matteomessmer
8+ */
9+ public class LongestPalindromicSubsequence {
10+ public static void main (String [] args ) {
11+ String a = "BBABCBCAB" ;
12+ String b = "BABCBAB" ;
13+
14+ String aLPS = LPS (a );
15+ String bLPS = LPS (b );
16+
17+ System .out .println (a + " => " + aLPS );
18+ System .out .println (b + " => " + bLPS );
19+ }
20+
21+ private static String LPS (String original ) {
22+ StringBuilder reverse = new StringBuilder ();
23+ reverse .append (original );
24+ reverse = reverse .reverse ();
25+ return recursiveLPS (original , reverse );
26+ }
27+
28+ private static String recursiveLPS (String original , String reverse ) {
29+ String bestResult = ""
30+
31+ //no more chars, then return empty
32+ if (original .length () == 0 || reverse .length () == 0 ) {
33+ bestResult = "" ;
34+ } else {
35+
36+ //if the last chars match, then remove it from both strings and recur
37+ if (original .charAt (original .length () - 1 ) == reverse .charAt (reverse .length () - 1 )) {
38+ String bestSubResult = recursiveLPS (original .substring (0 , original .length () - 1 ), reverse .substring (0 , reverse .length () - 1 ));
39+
40+ bestResult = reverse .charAt (reverse .length () - 1 ) + bestSubResult ;
41+ } else {
42+ //otherwise (1) ignore the last character of reverse, and recur on original and updated reverse again
43+ //(2) ignore the last character of original and recur on the updated original and reverse again
44+ //then select the best result from these two subproblems.
45+
46+ String bestSubResult1 = recursiveLPS (original , reverse .substring (0 , reverse .length () - 1 ));
47+ String bestSubResult2 = recursiveLPS (original .substring (0 , original .length () - 1 ), reverse );
48+ if (bestSubResult1 .length ()>bestSubResult2 .length ()) {
49+ bestResult = bestSubResult1 ;
50+ } else {
51+ bestResult = bestSubResult2 ;
52+ }
53+ }
54+ }
55+
56+ return bestResult ;
57+ }
58+ }
0 commit comments