騰訊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;
}
}