Not DP s s
15 16 17 18
isPalindrome(s, 16,16), right = left sine i =16 %2 == 0
isPalindrome(s, 17,18), right = left +1 since i=17 %2 =1
DP
01234567 89
forgee ks s k e e g f o r
i iiiiiiiiii i=7 i i i i i i i i
j => iter1 , s[i]= s[j] and j-i = 0 <= 1
i
j => iter2, s[i] = s[j] and j-i=1 <= 1, palin[7][8] = true
i
j => iter3, s[i] != s[j]
i=6
j
i
j
i
j
i
j=>s[i]=s[j] and palin[7][8] = ture => palin[6][9] = true, len = 9-6+1 = 4, substring(6,10)
s= "forgeeksskeegfor"
Longest palindrome substring is: geeksskeeg
2. Implementation
Q1: for i=0
for j=i+1
curr = s.substring(i,j)
if ( curr.length() > maxLen )
maxLen =curr.length() ;
str = curr;
A1: Time : O(n^2*n isPalindrome), Space:O(1)
Q1: ss
kssk
eksske
eeksskee
geeksskeeg
A1: Time:O(n^2), Space:O(n^2)
s[i] = s[j] and res[]
s[0] res[0]
s[0] = s[1]
Q1: a b c c b a d
0 1 2 3 4 5 6 7 8 9 10 11 12 13
A1: Time: O( 2n-1 gap* n isPalindrome), Space:O(1)
// Center outward // Time:O(n^2), Space:O(1) public String longestPalindrome(String s) { String res = new String(); if ( s == null || s.length()== 0) return res; // n + n-1 = 2n-1 for (int i= 0 ; i < 2*s.length() -1;i++) { int left = i/2; int right = i/2; if ( i%2 == 1 ) right++; int maxLen = 0; String str = lengthOfPalindrome(String s, int left, int right); if ( str.length() > maxLen) { maxLen = str.length(); res = str; } } return res; } private String lengthOfPalindrome( String s , int left ,int right ) { int l = left; int r = right; // <-l data-blogger-escaped-r-=""> while ( l >= 0 && r < s.length() && s.charAt(l) == s.charAt(r) ) { l--; r++; } return s.subString(l+1, r); // l become l-- but it is now l and r become r++ and it's right fit for substring() }
// Dynamic Programming // Time:O(n^2), Space:O(n^2) public String longestPalindrome( String s ) { String res = new String(); // validate the input if (s== null || s.length() == 0) boolean[][] palin = new Boolean[][]; int maxLen = 0; String res = ""; for (int i = s.length()-1; i>=0 ; i--) { for (int j = i; j < s.length();j++) { if ( s.charAt(i) == s.charAt(j) && (j-i <=1 || palin[i+1][j-1] == true ) ) { palin[i][j] = true; if ( maxLen < j-i+1) { maxLen = j-i+1; res = s.subStirng(i, j+1); } } } } return res; }
// REturn length of the longest palindrome string public int lps_recursive(Stirng s) { return lps(s,0,s.length()-1); } private int lps(String s, int left, int right) { if (left > right ) return 0; if (left == right ) return 1; if ( s.charAt(left) == s.charAt(right)) return lps(s, left+1, right-1) + 2 ; else return Math.max( lps(s,left+1,right), lps(s, left, right-1) ); }3. Similar Ones
(H) Shortest Palindrome
(E) Palindrome Permutation
(H) Longest Valid Parentheses
(M) Longest Common Prefix
(M) Longest Substring Without Repeating Characters
(H) Longest Consecutive Sequece
No comments:
Post a Comment