package leetcode.xuyi;
import org.junit.Test;
/**
* Created by ethan on 2015/5/7.
*/
public class LongestPalindromicSubstring {
// 动态规划的思想解决:
// 开一个N*N的数组,开始都置为false
// 当[i,j]的substring是一个palindromic的时候,并且,i-1和j+1位置上的char相等的时候,那么[i-1, j+1]的字串也是回文字串
public String longestPalindrome(String s) {
int len_str = s.length();
boolean[][] ans = new boolean[len_str][len_str];
int len_max = 1;
int first_max = 0;
for (int i=0; i<len_str; i++){
ans[i][i] = true;
}
// 处理(i, i+1)位置上的
for (int i=0; i<len_str-1; i++){
if (s.charAt(i)==s.charAt(i+1)){
ans[i][i+1] = true;
first_max = i;
len_max = 2;
}
}
int len;
for (len=3; len<=len_str; len++){
for (int i=0; i<len_str-len+1;i++){
int j=i+len-1;
if (s.charAt(i)==s.charAt(j) && ans[i+1][j-1]==true){
// 置真,更换最长的字串
ans[i][j] = true;
first_max = i;
len_max = len;
}
}
}
return s.substring(first_max, first_max+len_max);
}
// 从中间向两边开始找,考虑奇数和偶数
// 时间复杂度:O(n2)
public String longestPalindrome1(String s) {
int max = 0;
String max_str = null;
for (int i=0; i<s.length(); i++){
// 奇数
String tmp = getString(i, i, s);
if(tmp.length() > max)
{
max_str = tmp;
max = max_str.length();
}
// 偶数
tmp = getString(i, i + 1, s);
if(tmp.length() > max)
{
max_str = tmp;
max = max_str.length();
}
}
return max_str;
}
public String getString(int left, int right, String s){
int len = s.length();
while(left>-1 && right<len && s.charAt(left)==s.charAt(right)){
left--;
right++ ;
}
System.out.println(left + " " + right);
return s.substring(left+1, right);
}
}
Longest Palindromic Substring
最新推荐文章于 2021-02-21 14:43:18 发布