Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情。
一.题目介绍
1.题目来源
链接:LeetCode
2.题目
给你一个字符串s,找到s中最长的回文子串。
示例 1:
输入:s = "babad" 输出:"bab" 解释:"aba" 同样是符合题意的答案。
示例 2:
输入:s = "cbbd" 输出:"bb"
二.具体实现
1.实现思路
动态规划,这个题目的切入点是如果去针对每个元素做比较,那么就比较耗时,能够减少多重计算的方法就是定义其起点,终点以及其长度,这几个点都是临时存储的局部变量,我们先对数组相邻位置进行判断,如果其字符串相同则是找到了回文,依次类推,就能够找到字符串中最长的回文子串。
2.实现代码
1)自己的实现方式
public String longestPalindrome(String s) {
if (s == null || s.length() < 2) {
return s;
}
int strLen = s.length();
//最长回文串的起点
int maxStart = 0;
//最长回文串的终点
int maxEnd = 0;
//最长回文串的长度
int maxLen = 1;
//true:就是回文, false:不是回文
boolean[][] dp = new boolean[strLen][strLen];
for (int r = 0; r<strLen; r++){
for (int l = 0; l < r; l++){
if (s.charAt(l) == s.charAt(r) && (r - l <=2 || dp[l + 1][r-1])){
dp[l][r] = true;
if (r - l + 1 > maxLen) {
maxLen = r - l + 1;
maxStart = l;
maxEnd = r;
}
}
}
}
return s.substring(maxStart, maxEnd + 1);
}
2)题友的实现方式
暴力求解,列举所有的子串,判断是否为回文串,保存最长的回文串。
3.运行结果
三.题后思考
关于回文的题目,核心思路还是依次比较,找到回文,然后进行其他的操作,另外官方题解中心扩散法也是一个最优解。