LeetCode - 最长回文子串
废话不多说,先上地址:
https://leetcode-cn.com/problems/longest-palindromic-substring/submissions/ 中文版 英文版的直接把 -cn 删除就可以访问了
接下来是题目描述:
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:
输入: “babad”
输出: “bab”
注意: “aba” 也是一个有效答案。
示例 2:
输入: “cbbd”
输出: “bb”
首先,我们看到题目以后的想法是什么呢?什么样的字符串是回文字符串,然后才可以考虑找到最长的回文子串。
对于回文字符串一共有以下三种:
- aa
- aba
- a
所以我们那么更长的字符串是不是回文我们应该怎么判断呢? 如果字符串的首尾两个字符一样的话,那么这个字符串就是不是回文就取决于首尾之间的字符串了。如果我们定义一个 布尔值的数组 dp[i][j] 表示从i到j的区间是否是回文,那么如果 i 位置 的字符和j位置的字符一样,dp[i][j] = dp[i+1][j-1];
public static String longestPalindrome(String s) {
//字符串是null 或者是长度为0 返回
String res = "";
if (s == null || s.length() == 0) {
return res;
}
int max = 0;
boolean[][] dp = new boolean[s.length()][s.length()];
for (int i = 0; i < s.length(); i++) {
for (int j = 0; j <= i; j++) {
if (j == i) {
//只有一个字符 这里表示a的情况
dp[j][i] = true;
}
if (j + 1 == i && s.charAt(j) == s.charAt(i)) {
// aa 情况初始化
dp[j][i] = true;
}
}
}
for (int i = 0; i < s.length(); i++) {
for (int j = 0; j <= i; j++) {
// j+1 < i 表明是包含了字符的结构
if (j + 1 < i && s.charAt(j) == s.charAt(i)) {
//状态转移方程
dp[j][i] = dp[j + 1][i - 1];
}
if (dp[j][i] && i - j + 1 > max) {
max = i - j;
res = s.substring(j, i + 1);
}
}
}
//返回结果
return res;
}
题目不麻烦,不多说,如果发现不可以ac,请评论谢谢。