c
题目
给你一个字符串 s
,找到 s
中最长的回文子串。
输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。
输入:s = "cbbd"
输出:"bb"
输入:s = "abcedcbaeee"
输出:"eee"
输入:s = "ac"
输出:"a"
输入:s = "a"
输出:"a"
解题思路
个人思路
本题采用动态规划去解决;
-
若字符串长度小于2,则本身就是回文串,直接返回;
-
设计动态规划,dp[i][j]=true;表示字符串从i位置到j位置都是回文串;
若i位置的字符和j位置的字符是不同的,则dp[i][j] =false;
若i和j位置的字符是相同的,那就判断i+1到,j-1位置上的字符是否相同;根据当前字符串长度是否相邻即j-1 - (i+1)+1<2 推出 j-i<3,由这个可以保证i,j不是相邻的;若相邻(j-i<3)则dp[i][j]=true, 否则dp[i][j]=dp[i+1][j-1];
因此可以计算出来最长回文串;
public String longestPalindrome(String s) {
if (s.length() < 2) {
return s;
}
Boolean[][] dp = new Boolean[s.length()][s.length()];
for (int i = 0; i < s.length(); i++) {
dp[i][i] = true;
}
int max = 1;
int begin = 0;
// i,j表示 从i->j是否是回文
for (int j = 1; j < s.length(); j++) {
for (int i = 0; i < j; i++) {
if (s.charAt(i) != s.charAt(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] && Math.max(max, j - i + 1) != max) {
max = Math.max(max, j - i + 1);
begin = i;
}
}
}
return s.substring(begin, begin + max);
题目来源
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-palindromic-substring
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。