-
Notifications
You must be signed in to change notification settings - Fork 4
/
5. Longest Palindromic Substring.java
73 lines (64 loc) · 2.2 KB
/
5. Longest Palindromic Substring.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
class Solution {
public String longestPalindrome(String s) {
int n = s.length();
if (n == 0) return "";
int maxLen = 1;
int maxCenter = 0;
boolean[][] dp = new boolean[n][n];
for (int i = 0; i < n; i++) {
dp[i][i] = true;
}
for (int i = 0; i < n - 1; i++) {
if (s.charAt(i) == s.charAt(i + 1)) {
dp[i][i + 1] = true;
maxLen = 2;
maxCenter = i;
}
}
for (int len = 3; len <= n; len++) {
for (int i = 0; i < n - len + 1; i++) {
int j = i + len - 1;
if (s.charAt(i) == s.charAt(j) && dp[i + 1][j - 1]) {
dp[i][j] = true;
if (len > maxLen) {
maxLen = len;
maxCenter = i;
}
}
}
}
return s.substring(maxCenter, maxCenter + maxLen);
}
}
// One Of The Easiest Implementation Solution
// However need to fix some rare cases
class Solution {
public String longestPalindrome(String s) {
int n = s.length();
if (n == 0)
return "";
StringBuilder sb = new StringBuilder(s);
String t = sb.reverse().toString();
int[][] dp = new int[n + 1][n + 1];
int maxlen = 0;
int startIndex = -1;
for (int i = 1; i < dp.length; i++) {
for (int j = 1; j < dp[i].length; j++) {
char x = s.charAt(i - 1);
char y = t.charAt(j - 1);
if (x == y) {
dp[i][j] = dp[i - 1][j - 1] + 1;
if (maxlen < dp[i][j]) {
maxlen = dp[i][j];
startIndex = i - dp[i][j];
}
}
}
}
for (int i = 0; i < dp.length; i++) {
System.out.println(Arrays.toString(dp[i]));
}
return s.substring(startIndex, startIndex + maxlen);
}
}