計算迴文子序列(Java語言,窮舉法,遞歸)

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章