视频解析
视频讲解
题目
给你一个字符串 s,找到 s 中最长的回文子串。
如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。
代码
public class LeeCode5 {
public static void main(String[] args) {
String str = "dfabcbail";
String s = new LeeCode5().longestPalindrome_3(str);
System.out.println(s);
}
public String longestPalindrome_1(String s) {
int len = s.length();
if (len < 2) {
return s;
}
int maxLen = 1;
int begin = 0;
char[] charArray = s.toCharArray();
for (int i = 0; i < len - 1; i++) {
for (int j = 0; j < len; j++) {
if (j - i + 1 > maxLen && validPalindromic(charArray, i, j)) {
maxLen = j - i + 1;
begin = i;
}
}
}
return s.substring(begin, begin + maxLen);
}
public String longestPalindrome_2(String s) {
int len = s.length();
if (len < 2) {
return s;
}
int maxLen = 1;
int begin = 0;
boolean[][] dp = new boolean[len][len];
for (int i = 0; i < len; i++) {
dp[i][i] = true;
}
char[] charArray = s.toCharArray();
for (int L = 2; L <= len; L++) {
for (int i = 0; i < len; i++) {
int j = L + i - 1;
if (j >= len) {
break;
}
if (charArray[i] != charArray[j]) {
dp[i][j] = false;
} else {
if (j - i < 3) {
dp[i][j] = true;
} else {
dp[i][j] = dp[i + 1][j - 1];
}
}
if (dp[i][j] && j - i + 1 > maxLen) {
maxLen = j - i + 1;
begin = i;
}
}
}
return s.substring(begin, begin + maxLen);
}
public String longestPalindrome_3(String s) {
if (s == null || s.length() < 1) {
return "";
}
int start = 0, end = 0;
for (int i = 0; i < s.length(); i++) {
int len1 = expandAroundCenter(s, i, i);
int len2 = expandAroundCenter(s, i, i + 1);
int len = Math.max(len1, len2);
if (len > end - start) {
start = i - (len - 1) / 2;
end = i + len / 2;
}
}
return s.substring(start, end + 1);
}
public int expandAroundCenter(String s, int left, int right) {
while (left >= 0 && right < s.length() && s.charAt(left) == s.charAt(right)) {
--left;
++right;
}
return right - left - 1;
}
private boolean validPalindromic(char[] charArray, int left, int right) {
while (left < right) {
if (charArray[left] != charArray[right]) {
return false;
}
left++;
right--;
}
return true;
}
public String longestPalindrome_4(String s) {
if (s.length() < 2) {
return s;
}
String[] split = s.split("");
String plalindromeStr = "";
int length = 0;
for (int i = 0; i < s.length(); i++) {
StringBuilder stringBuilder = new StringBuilder();
for (int j = i; j < split.length; j++) {
stringBuilder.append(split[j]);
String s1 = stringBuilder.toString();
boolean flag = !isPlalindrome(s1) && s1.length() != 1;
if (!flag) {
if (s1.length() > length) {
length = s1.length();
plalindromeStr = s1;
}
}
}
}
return plalindromeStr;
}
public boolean isPlalindrome(String str) {
if (str.equals(new StringBuilder(str).reverse().toString())) {
return true;
}
return false;
}
}