JAVA动态规划(三)--最长回文字符串(可删除中间字符)【腾讯2016实习生笔试题】
2016-04-04 15:35
651 查看
题目:所谓回文字符串,就是一个字符串,从左到右读和从右到左读是完全一样的,比如:”aba”,”abba”.对于一个字符串,可以通过删除某些字符二编程回文字符串,如:“cabebaf”,删除“c,e,f”后剩下子串“abba”就是回文字符串。
要求:给定任意一个字符串,字符串的最大长度1000,计算出最长的回文字符串长度。
输入:字符串
输出:最大的回文字符串的长度。
分析:对于可删除的最大回文字符串的原理可以借鉴最长字符子序列。
如果第一个字符和最后一个字符相同,则p[1][n-1]=p[2][n-2],所以,p[i][j]的定义是:字符串位置i左右和位置j右边部分的最大回文字符串长度。
转移方程:
if(s[i]=s[j]),则p[i][j]=p[i-1][j+1]+_1;
else p[i][j]=max{p[i-1][j], p[i][j+1}.
代码如下:
为了方便比较:我把不能删除的最大回文字符串的代码也放在这:
要求:给定任意一个字符串,字符串的最大长度1000,计算出最长的回文字符串长度。
输入:字符串
输出:最大的回文字符串的长度。
分析:对于可删除的最大回文字符串的原理可以借鉴最长字符子序列。
如果第一个字符和最后一个字符相同,则p[1][n-1]=p[2][n-2],所以,p[i][j]的定义是:字符串位置i左右和位置j右边部分的最大回文字符串长度。
转移方程:
if(s[i]=s[j]),则p[i][j]=p[i-1][j+1]+_1;
else p[i][j]=max{p[i-1][j], p[i][j+1}.
代码如下:
package dynamic_programming; /** * @author Gavenyeah * @date Time: 2016年4月4日上午11:50:48 * @des: */ // 动态规划:求最长回文字符串(可通过删除某些字符) public class Longest_Pa_Del { public static void main(String[] args) { String s = "12343241"; new Longest_Pa_Del().palindrome(s); } //通过一个二维数组p[i][j]记录i边和j右边的字符串部分的回文串长度 public void palindrome(String s) { char[] ch = (" " + s + " ").toCharArray(); //前后增加两个空白字符是为了将原始字符串的首尾一致化处理,不用单独处理 int n = ch.length; int p[][] = new int ; int maxLen = 0; for (int i = 1; i < n - 1; i++) { for (int j = n - 2; j >= i; j--) { if (ch[i] == ch[j] && i < j) { p[i][j] = p[i - 1][j + 1] + 2; } else if (ch[i] == ch[j] && i == j) {//i=j说明,回文串中间有个单独的字符 p[i][j] = p[i - 1][j + 1] + 1; } else if (p[i - 1][j] >= p[i][j + 1]) { p[i][j] = p[i - 1][j]; } else p[i][j] = p[i][j + 1]; if (p[i][j] > maxLen) { maxLen = p[i][j]; } } } System.out.println(maxLen); } }
为了方便比较:我把不能删除的最大回文字符串的代码也放在这:
package dynamic_programming; /** * @author Gavenyeah * * @date Time: 2016年4月3日下午5:53:58 */ public class LongestPalindrome { public static void main(String[] args) { String s="1"; // String s="123321abccba12332"; // new LongestPalindrome().palindrome(s); new LongestPalindrome().getPalindrome(s); } //將可能是回文串的字符取出進行比較 public void getPalindrome(String s){ String longestPa=s.substring(0,1);//附初值,以及當s的長度為1的時候的返回值 int maxLen=0; for(int i=0;i<s.length();i++){ for(int j=i+1;j<s.length();j++){ if(s.charAt(i)==s.charAt(j)){ String pa=s.substring(i,j+1); int len=j-i+1; if(maxLen<len&&isPalindrome(pa,len)){ maxLen=len; longestPa=pa; } } } } System.out.println(longestPa); } public boolean isPalindrome(String pa,int len){ for(int i=0,j=len-1;i<=j;i++,j--){ if(pa.charAt(i)!=pa.charAt(j)){ return false; } } return true; } /* //逐步向后查找法 public void palindrome(String s){ if(s.length()==1||(s.length()==2&&s.charAt(0)==s.charAt(1))){ System.out.print(s); return; } char c[]=s.toCharArray(); int max=0; int loc=0; for(int i=2;i<c.length;i++){ int count=0; int k=i; int j=i-1; if(c[k]==c[j]){ while((k<c.length&&j>=0)&&c[k]==c[j]){ count++; k++; j--; } count*=2; } else if(c[k]==c[j-1]){ while((k<c.length&&j>=0)&&c[k]==c[j-1]){ count++; k++; j--; } count=count*2+1; } if(max<count){ max=count; if(max%2==0){ loc=j+1; } else loc=j; } } int k=1; while(k<=max){ System.out.print(c[loc]); loc++; k++; } }*/ }
相关文章推荐
- 静态属性和方法理解
- spring 父子容器 事务管理
- [JAVA · 初级]:16.常用类
- springMVC4(10)强大类型转换器实例解析
- 【转载】GangWang-java synchronized详解
- 【java集合框架源码剖析系列】java源码剖析之TreeSet
- 【java集合框架源码剖析系列】java源码剖析之TreeSet
- java对象内存理解
- Swing:关于Java界面编程的第一课,如何正确的处理界面中的线程
- 一个java程序/项目检测工具.方法是否被调用以及频率
- java内存分析_2
- java中compareTo和compare方法之比较 | Java基础
- Java接口RandomAccess
- SpringMVC学习记录(一)--环境配置
- java struts2学习笔记之线程安全
- Java开发必装的IntelliJ IDEA插件
- 简单java类
- Spring 注解@Transactional详解
- spring security+mybatis+springMVC构建一个简单的项目
- eclipse配置;eclipse和jdk对应关系