letcode刷题--4.最长回文字符串
给你一个字符串 s,找到 s 中最长的回文子串。
方法一:暴力解法
超出时间限制
class Solution { public String longestPalindrome(String s) { String ans = ""; int len = s.length(); int max = 0; for (int i = 0; i < len; i ++){ for (int j = i + 1; j <= len; j ++){ String test = s.substring(i,j); if (isPalindrome(test) && test.length() > max){ ans = s.substring(i,j); max = Math.max(max, ans.length()); } } } return ans; } public boolean isPalindrome(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; } }
方法二:动态规划,相当于填写一个二维表,需要使用到状态转移方程
dp[i][j]的值需要计算dp[i+1][j-1]是不是true,以列来填表
class Solution { public String longestPalindrome(String s) { int len = s.length(); if (len < 2) { return s; } int maxLen = 1; char[] chars = s.toCharArray(); int begin = 0; boolean[][] dp = new boolean[len][len]; for (int i = 0; i < len; i++) { dp[i][i] = true; } for (int j = 1; j < len; j++) { for (int i = 0; i < j; i++) { if (chars[i] != chars[j]) { dp[i][j] = false; } else { if (j - i < 3) { dp[i][j] = true; } else { dp[i][j] = dp[i + 1][j - 1]; } } if (dp[i][j] && j - i + 1 > maxLen) { maxLen = j - i + 1; begin = i; } } } return s.substring(begin, begin + maxLen); } }
方法三:中心扩散
class Solution { public String longestPalindrome(String s) { int len = s.length(); int start = 0; int end = 0; int maxLen = 0; if (len<1 || s == null){ return ""; } else { for (int i = 0;i < len; i ++){ int max1 = numsPalindrome(s,i,i); int max2 = numsPalindrome(s,i,i+1); maxLen = Math.max(max1,max2); if (maxLen > end - start) { start = i - (maxLen - 1) / 2; end = i + maxLen / 2; } } return s.substring(start,end+1); } } public int numsPalindrome(String s,int left,int right){ while (left>=0 && right < s.length() && s.charAt(left) == s.charAt(right)){ --left; ++right; } return right - left - 1; } }

浙公网安备 33010602011771号