標籤:class blog code java http tar
Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring.
https://oj.leetcode.com/problems/longest-palindromic-substring/
思路1(naive approach):依次檢查所有的子串(n^2),判斷是否是palindrome(n),複雜度 O(n^3)。
思路2(dp):dp[i][j] 代表從i到j的子串是否是palindrome。自下而上自左而右計算dp數組。時空複雜度都是 O(n^2)。
dp[i][j]=1 if:
- i=j;
- s.charAt(i)==s.charAt(j) && j-i<2
- s.charAt(i)==s.charAt(j) && dp[i+1][j-1]==1
思路3:遍曆字串的每個字元,從這個字元出發(或者這個字元和下一個字元出發)向兩側輻射找出最長的子串。時間複雜度 O(n^2),空間複雜度O(1)。
思路4:Manacher‘s algorithm。時空複雜度O(n)。有待研究。
DP代碼:
public class Solution { public String longestPalindrome(String s) { if (s == null || s.length() == 0) return null; int start = 0; int end = 0; int len = 0; boolean[][] dp = new boolean[s.length()][s.length()]; for (int i = s.length() - 1; i >= 0; i--) { for (int j = i; j < s.length(); j++) { if (i == j || (s.charAt(i) == s.charAt(j) && j - i < 2) || (s.charAt(i) == s.charAt(j) && dp[i + 1][j - 1])) { dp[i][j] = true; if (j - i + 1 > len) { len = j - i; start = i; end = j + 1; } } } } return s.substring(start, end); } public static void main(String[] args) { System.out.println(new Solution().longestPalindrome("ababadccd")); System.out.println(new Solution().longestPalindrome("a")); System.out.println(new Solution().longestPalindrome("")); }}
參考:
http://www.programcreek.com/2013/12/leetcode-solution-of-longest-palindromic-substring-java/
http://www.cnblogs.com/TenosDoIt/p/3675788.html
http://blog.csdn.net/worldwindjp/article/details/22066307