https://leetcode.com/problems/longest-palindromic-substring/
找出最长的palindrom substring
做法就是每个index 都作为中心点,以0,和length-1为边界把偶数和奇数长的substring找出来
然后记录下最长的
找出最长的palindrom substring
做法就是每个index 都作为中心点,以0,和length-1为边界把偶数和奇数长的substring找出来
然后记录下最长的
public class Solution { public String longestPalindrome(String s) { if (s.length() == 0){ return ""; } String longestEver = s.substring(0,1); for (int i = 0; i <= s.length()-2; i++){ String temp = findPadlindrome(i,i,s); String temp2 = findPadlindrome(i,i+1,s); String longer = temp.length()>temp2.length()?temp:temp2; longestEver = longer.length()>longestEver.length()?longer:longestEver; } return longestEver; } private String findPadlindrome(int centerLeft, int centerRight, String s){ if (s.charAt(centerLeft) != s.charAt(centerRight)){ return ""; } int begin = centerLeft; int end = centerRight; while (begin >= 0 && end < s.length() && s.charAt(begin) == s.charAt(end)){ begin -= 1; end += 1; } return s.substring(begin+1, end); } }
Google了一下, DP的算法
就是用 check[a][b] 代表 substring a到b 是不是palindrom
可以分解成
check[a][b] = check[a+1][b-1] str[a] == str[b]
当a == b时 check[a][b] = true
public class Solution { public String longestPalindrome(String s) { boolean check[][] = new boolean[s.length()][s.length()]; int longest = 0; int start=0, end=0; for (int i = 0; i < s.length(); i++){ check[i][i] = true; for (int j = 0; j < i; j++){ check[j][i] = s.charAt(i) == s.charAt(j) && ((i-j < 2) ||check[j+1][i-1]); if (check[j][i] && longest < (i-j+1)){ longest = i-j+1; start = j; end = i; } } } return s.substring(start, end+1); } }
No comments:
Post a Comment