算法_ 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来存储找到的最长回文。
代码如下:
求最长回文的问题,应该是典型的动态规划问题。采用一个二维数组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; }
相关文章推荐
- 书评:《算法之美( Algorithms to Live By )》
- 动易2006序列号破解算法公布
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法
- C#折半插入排序算法实现方法
- C++动态规划之最长公子序列实例
- C++动态规划之背包问题解决方法
- 基于C++实现的各种内部排序算法汇总
- C++线性时间的排序算法分析