Java算法题之最长回文子串
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:
输入: “babad”
输出: “bab”
注意: “aba” 也是一个有效答案。
示例 2:
输入: “cbbd”
输出: “bb”
结题思路:
动态规划法——如果一个子串的前后两个字母相同,则往里面依次比较,如果又相同继续下去。遇到这种重复判断的优先想到动态规划法。
具体解法:
1、如果字符串s的长度小于2(即空字符串和含一个字符的字符串),那么它本身就是一个最长的回文子串。
2、如果字符串的长度大于2,定义一个P{i,j}表示子串,判断如果i == j , 则递进判断P{i+1,j-1},直到i = j的时候(该子串的长度是偶数个)或者 i和j之间只有一个数的时候,说明这个子串就是回文子串。
因此,这里有个边界问题,i+1 < j-1,即 j - i > 2。
package LongestPalindromicSubstring;
public class Solution {
public String longestPalindrome(String s) {
int len = s.length();
if(len < 2) {
return s;
}
boolean[][] dp = new boolean[len][len];
for(int i = 0 ; i < len ; i++) {
dp[i][i] = true;
}
int maxLen = 1;
int start = 0;
for(int j = 1 ; j < len ; j++) {
for(int i = 0 ; i < j ; i++) {
if(s.charAt(i) == s.charAt(j)) {
if(j - i < 3) {
dp[i][j] = true;
}else {
dp[i][j] = dp[i + 1][j - 1];
}
}else {
dp[i][j] = false;
}
if(dp[i][j]) {
int curLen = j - i + 1;
if(curLen > maxLen) {
maxLen = curLen;
start = i;
}
}
}
}
return s.substring(start , start + maxLen);
}
}
package LongestPalindromicSubstring;
public class Client {
public static void main(String[] args) {
String s = "abcdefgfedcbasdlewo";
String s2 = "cbbd";
Solution st = new Solution();
System.out.println(st.longestPalindrome(s2));
}
}
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-palindromic-substring
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。