题目:
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。 示例 1: 输入: "babad" 输出: "bab" 注意: "aba" 也是一个有效答案。 示例 2: 输入: "cbbd" 输出: "bb" 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/longest-palindromic-substring 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
分析:
很容易可以想到使用简单循环来处理,从第一个字符开始,依次遍历,然后判断每次循环得到的是否回文,取长度最长的输出,按照这种思路可以得到如下代码:
public static String longestPalindrome(String s) { StringBuilder result = new StringBuilder(); if ("".equals(s)) { return result.toString(); } for (int i = 0; i < s.length(); i++) { StringBuilder temp = new StringBuilder(); for (int j = i + 1; j <= s.length(); j++) { temp.append(s.substring(j - 1,j)); if (temp.toString().equals(temp.reverse().toString())) { if (temp.length() > result.length()) { result.delete(0, result.length()); result.append(temp); } } temp.reverse(); } } return result.toString(); }
但这种方式对于字符串过长时,耗时较长,因此是无法全部通过LeetCode的测试用例的,更换思路:
使用中心拓展的方式去找回文数,相对来说时间可以缩短一半。但要注意奇偶数的处理!
public static String longestPalindrome2(String s) { int n = s.length(); String res = ""; boolean[][] dp = new boolean[n][n]; for (int i = 0; i < n; i++) { for (int j = i; j >= 0; j--) { if (s.charAt(i) == s.charAt(j) && (i - j < 2 || dp[i - 1][j + 1])) dp[i][j] = true; if (dp[i][j] && (i - j + 1 > res.length())) { res = s.substring(j, i + 1); } } } return res; }