您的位置:首页 > 编程语言 > PHP开发

算法_ LongestPalindromicSubstring

2016-04-09 16:59 513 查看
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.

求最长回文的问题,应该是典型的动态规划问题。采用一个二维数组flag[i][j] 用来存储字符串S中从第i个到第j之间的字符串是不是回文。

则用动态规划的思想,可以退出如果flag[i+1][j-1] =1,即是回文且当S.charat(i)和S.charat(j)相等时,则flag[i][j]=1。

即flag[i+1][j-1]==1&&a.charAt(i)==a.charAt(j);

首先要处理的是初始情况:

1、所有长度为一的子字符串都是回文,即flag[i][i]=1;

2、长度为2且两个字母是相等的也是回文,即S.charat(i)==S.charat(i+1)。

同时要考虑最长的回文不唯一的情况,所以采用arraylist来存储找到的最长回文。

代码如下:

public static ArrayList<String> findString(String a){
ArrayList<String> result = new ArrayList<>();
int n = a.length();
int max=1;
int maxresult = 1;
int[][] flag = new int

;

//设置初始一个和两个的标志符
for(int i = 0; i<n;i++){
flag[i][i] = 1;
result.add(a.substring(i, i+1));
if(i+1<n){
if(a.charAt(i)==a.charAt(i+1)){
flag[i][i+1]=1;

result.removeAll(result);
result.add(a.substring(i, i+2));
}
else {
flag[i][i+1]=0;
}
}
}

//动态规划之后的最长值

for(int len = 3; len<n; len++){
for(int i=0;i<n-len+1;i++){
int j = i+len-1;
if(flag[i+1][j-1]==1&&a.charAt(i)==a.charAt(j)){
flag[i][j]=1;
//

max = len;
if(max>maxresult){
maxresult = max;
result.removeAll(result);
result.add(a.substring(i, i+len));
}else if(max == maxresult){
result.add(a.substring(i, i+len));
}

}else {
flag[i][j]=0;
}

}

}

for(int i =0;i<n;i++){
for(int j=0;j<n;j++){
System.out.print(flag[i][j]+" ");
if(j!=0&&j%(n-1)==0){
System.out.println();
}
}
}

System.out.println(maxresult);

return result;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 动态规划