一.题目介绍
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.运行结果
三.题后思考
关于回文的题目,核心思路还是依次比较,找到回文,然后进行其他的操作,另外官方题解中心扩散法也是一个最优解。