-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathNo5LongestPalindromicSubstring.java
74 lines (66 loc) · 1.84 KB
/
No5LongestPalindromicSubstring.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
74
package com.wzx.leetcode;
/**
* @author wzx
* @see <a href="https://leetcode.com/problems/longest-palindromic-substring/">https://leetcode.com/problems/longest-palindromic-substring/</a>
*/
public class No5LongestPalindromicSubstring {
/**
* 动态规划
* dp[i][j]: s[i~j]是否是回文串
* 递推公式: if s[i]==s[j]: dp[i][j] = dp[i + 1][j - 1](注意回文串长度为偶数的特殊情况)
* <p>
* time: O(n^2)
* space: O(n^2)
*/
public String longestPalindrome1(String s) {
boolean[][] dp = new boolean[s.length()][s.length()];
for (int i = 0; i < s.length(); i++) {
dp[i][i] = true;
}
int begin = 0;
int maxLength = 1;
for (int i = s.length() - 2; i >= 0; i--) {
for (int j = i + 1; j < s.length(); j++) {
if (s.charAt(i) == s.charAt(j)) {
// 长度为2的回文子串
if (j - i == 1) {
dp[i][j] = true;
} else {
dp[i][j] = dp[i + 1][j - 1];
}
}
// 标记最大回文子串
if (dp[i][j] && j - i + 1 > maxLength) {
begin = i;
maxLength = j - i + 1;
}
}
}
return s.substring(begin, begin + maxLength);
}
/**
* 左右指针
* <p>
* time: O(n^2)
* space: O(1)
*/
public String longestPalindrome2(String s) {
char[] sArray = s.toCharArray();
int begin = 0, maxLen = 0;
for (int i = 0; i < sArray.length; i++) {
int len = Math.max(expand(sArray, i, i), expand(sArray, i, i + 1));
if (len > maxLen) {
maxLen = len;
begin = i - (len - 1) / 2;
}
}
return s.substring(begin, begin + maxLen);
}
private int expand(char[] s, int left, int right) {
while (left >= 0 && right < s.length && s[left] == s[right]) {
left--;
right++;
}
return (right - 1) - (left + 1) + 1;
}
}