面试常用算法——Longest Palindromic Substring(最长回文子串)
第一种:
public static void main(String[] args) { String s = "abcbaaaaabcdcba"; int n,m; String re = ""; for(int i = 0; i < s.length();i++){ for(int j = i+1;j< s.length();j++){ n = i; m = j; for(;j > i;j--,i++){ if(s.charAt(i) != s.charAt(j)) break; } if(j <= i){ if(m-n > re.length()) re = s.substring(n, m+1); } } } System.out.println(re); }
看的是国外的一篇博客,他把这种方法叫做是Naive Approach,这是最容易想到的一个方法,效率确实不怎样,时间复杂度是O(n^3)级。
第二种方法:
public static void main(String[] args) { String s = "abcbaaaaabcdcba"; int[][] table = new int[s.length()][s.length()]; int i, j; for (i = 0; i < s.length(); i++) for (j = 0; j < s.length(); j++) table[i][j] = 0; for (i = 0; i < s.length(); i++) { for (j = 0; j < s.length(); j++) { if (j + i >= s.length()) { break; } if (j == j + i) table[j][j + i] = 1; else if (j + 1 == j + i) { if (s.charAt(j) == s.charAt(j + i)) table[j][j + i] = 1; } else { if (s.charAt(j) == s.charAt(j + i) && table[j + 1][j + i - 1] == 1) table[j][j + i] = 1; } } } for (i = 0; i < s.length(); i++) { for (j = 0; j < s.length(); j++) { System.out.print(table[i][j] + " "); table[i][j] = 0; } System.out.println(); } }
这个算法的思路:
构建一个n*n的表格,表格中table[i][j] == 1代表子串(i,j)是回文串,table[i][j] ==0即代表子串(i,j)不为回文串,并且有这样的推算规则:
1)table[i][i]必为1;
2)table[i][i+1]==1的满足条件是:s.charAt(i) == s.charAt(i+1);
3)其他table[i][j] == 1 的满足条件是:s.charAt(i) == s.charAt(j) && table[i+1][j-1] == 1.
该算法的时间复杂度为 O(n^2), 空间复杂度 O(n^2)。