概述
题解地址:https://leetcode-cn.com/problems/longest-palindromic-substring/solution/zhong-xin-kuo-san-dong-tai-gui-hua-by-liweiwei1419/
方法一:暴力解法(重要)
Java 代码:
public class Solution {
public String longestPalindrome(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 = i + 1; j < len; j++) {
if (j - i + 1 > maxLen && valid(charArray, i, j)) {
maxLen = j - i + 1;
begin = i;
}
}
}
return s.substring(begin, begin + maxLen);
}
/**
* 验证子串 s[left, right] 是否为回文串
*/
private boolean valid(char[] charArray, int left, int right) {
while (left < right) {
if (charArray[left] != charArray[right]) {
return false;
}
left++;
right--;
}
return true;
}
}
方法二:中心扩散
Java 代码:
public class Solution2 {
public String longestPalindrome(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++) {
int oddLen = expandAroundCenter(charArray, i, i);
int evenLen = expandAroundCenter(charArray, i, i + 1);
int curMaxLen = Math.max(oddLen, evenLen);
if (curMaxLen > maxLen) {
maxLen = curMaxLen;
begin = i - (maxLen - 1) / 2;
}
}
return s.substring(begin, begin + maxLen);
}
/**
* @param charArray 原始字符串的字符数组
* @param left 左边界(可以取到)
* @param right 右边界(可以取到)
* @return 回文串的长度
*/
private int expandAroundCenter(char[] charArray, int left, int right) {
// 当 left = right 的时候,回文中心是一个字符,回文串的长度是奇数
// 当 right = left + 1 的时候,此时回文中心两个字符,回文串的长度是偶数
int len = charArray.length;
int i = left;
int j = right;
while (i >= 0 && j < len) {
if (charArray[i] == charArray[j]) {
i--;
j++;
} else {
break;
}
}
// 跳出 while 循环时,恰好满足 s.charAt(i) != s.charAt(j),此时回文串的长度是 j - i - 1
return j - i - 1;
}
}
方法三:动态规划(重要)
Java 代码:
public class Solution {
public String longestPalindrome(String s) {
// 特判
int len = s.length();
if (len < 2) {
return s;
}
int maxLen = 1;
int begin = 0;
// dp[i][j] 表示 s[i, j] 是否是回文串
boolean[][] dp = new boolean[len][len];
char[] charArray = s.toCharArray();
for (int i = 0; i < len; i++) {
dp[i][i] = true;
}
for (int j = 1; j < len; j++) {
for (int i = 0; i < j; i++) {
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);
}
}
最后
以上就是光亮服饰为你收集整理的「力扣」第 5 题:最长回文子串(动态规划)的全部内容,希望文章能够帮你解决「力扣」第 5 题:最长回文子串(动态规划)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复