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

计算回文子序列(Java语言,穷举法,递归)

2016-06-14 10:39 447 查看
腾讯2017暑期实习生编程题1。

给定一个字符串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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法