leetcode-5-最长回文子串
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
方法一:暴力法
class Solution{ // 暴力法 public String longestPalindrome(String s) { //定义一个空字符串 String ans = ""; int max = 0; int len = s.length(); //循环遍历字符串的每一个可能字符串 for (int i = 0; i < len; i++) for (int j = i + 1; j <= len; j++) { //定义一个新字符串用来承接可能的字符串 String test = s.substring(i, j); //判断字符串是否为回文字符串并且字符串的长度大于当前的最大值 if (isPalindromic(test) && test.length() > max) { //如果是最大值,则返回到ans里面 ans = s.substring(i, j); //更新最大值标记 max = Math.max(max, ans.length()); } } //返回最大长度的字符串 return ans; } // 定义一个函数,完成回文串的验证 public boolean isPalindromic(String s) { int len = s.length(); for (int i = 0; i < len / 2; i++) { if (s.charAt(i) != s.charAt(len - i - 1)) { return false; } } return true; } }
方法二:暴力法,动态规划优化
class Solution{ // 暴力法优化,动态规划 public String longestPalindrome(String s) { int length = s.length(); //数组P里面存储的是字符串是不是回文串的true和false boolean[][] P = new boolean[length][length]; // 定义最大长度 int maxLen = 0; // 定义空字符串 String maxPal = ""; // 遍历所有的长度 for (int len = 1; len <= length; len++){ for (int start = 0; start < length; start++) { int end = start + len - 1; // 下标已经越界,结束本次循环 if (end >= length) break; // 长度为 1 和 2 的单独判断下,递归调用 P[start][end] = (len == 1 || len == 2 || P[start + 1][end - 1]) && s.charAt(start) == s.charAt(end); // 如果P数组里面的是true并且长度大于之前的最大长度,则更新最长回文子串 if (P[start][end] && len > maxLen) { maxPal = s.substring(start, end + 1); } } } return maxPal; } }

浙公网安备 33010602011771号