腾讯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;
}
}