leetbook:中级算法
类型:数组和字符串
题目名:最长回文子串
原题URL:https://leetcode-cn.com/leetbook/read/top-interview-questions-medium/xvn3ke/
题目描述
给你一个字符串 s
,找到 s
中最长的回文子串。
示例
示例 1:
输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。
示例 2:
输入:s = "cbbd"
输出:"bb"
示例 3:
输入:s = "ac"
输出:"a"
限制
1 <= s.length <= 1000
s
仅由数字和英文字母(大写和/或小写)组成
解题思路
1.动态规划,思路是如果当前字符,和遍历到的字符相等,并且中间的字符串是回文字符串,那么这个字符就是回文字符串
2.所以用这个boolean二维数组来存储str[ i ] [ j ]这个字符串是不是回文字符
3.动态规划二层循环解决
解题代码
class Solution {
public String longestPalindrome(String s) {
char[] chars = s.toCharArray();
//标记第i~j个位置的字符串是不是回文字符
boolean[][] lens = new boolean[chars.length][chars.length];
//初始化
for(int i =0;i<chars.length;i++) {
lens[i][i] = true;
}
int max = 0;
int st = 0;
int ed = 0;
for(int end = 1;end<chars.length;end++) {
for(int start = 0;start<end;start++) {
if(chars[start]==chars[end]) {
if(start+1==end||lens[start+1][end-1]){
lens[start][end]=true;
if(end-start+1>max) {
max = end-start+1;
st = start;
ed = end;
}
}
}
}
}
return s.substring(st,ed+1);
}
}