计算回文子序列(Java语言,穷举法,递归)
2016-06-14 10:39
447 查看
腾讯2017暑期实习生编程题1。
给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢?
输出需要删除的字符个数。
注意:由于穷举法解决本题的时间复杂度高达O(2^N),实际上完全没有实用性。因此本解题思路仅作研究思路用。
给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢?
输出需要删除的字符个数。
注意:由于穷举法解决本题的时间复杂度高达O(2^N),实际上完全没有实用性。因此本解题思路仅作研究思路用。
import java.io.*; class test { public static void main (String[] args) throws java.lang.Exception { System.out.println(getLenOfMaxPalindromic("123216")); } public static int getLenOfMaxPalindromic(String s) { int max = getLenOfMaxPalindromicEx(s,0, new StringBuilder(), 0); return max; } public static int getLenOfMaxPalindromicEx(String s, int start, StringBuilder sb, int max) { //算法思路:给定字符串z1...zn,其子序列存在2^n种情况。 //每次递归针对一个字符穷举存在和不存在的情况。 //当所有字符串的有元都被穷举时,则递归中止 //每次递归完成,会把已经决策的字符串写入缓存sb中。 //每次递归完成,需要保证缓存sb中的内容不受影响 //s表示源字符串 //start表示未决策的字符串的起点索引 //sb,缓存已决策的字符串 if(start >= s.length()) {//递归中止 if(!isPalindromic(sb)) { return max; } int len = sb.length(); if(len <= max) { return max; } return len; } max = getLenOfMaxPalindromicEx(s, start + 1, sb, max); sb.append(s.charAt(start)); max = getLenOfMaxPalindromicEx(s, start + 1, sb, max); sb.deleteCharAt(sb.length() - 1);//保证缓存sb的内容不受影响 return max; } public static boolean isPalindromic(StringBuilder sb) { char[] array = sb.toString().toCharArray(); for(int i = 0;i < array.length/2;i ++) { if(array[i] != array[array.length - 1 - i]) { return false; } } return true; } }
相关文章推荐
- 书评:《算法之美( Algorithms to Live By )》
- 动易2006序列号破解算法公布
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- 经典排序算法之冒泡排序(Bubble sort)代码
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法
- C#折半插入排序算法实现方法
- 基于C++实现的各种内部排序算法汇总
- C++线性时间的排序算法分析
- C++实现汉诺塔算法经典实例