1. 程式人生 > >最長對稱子串(動態規劃解法)

最長對稱子串(動態規劃解法)

5-12 最長對稱子串   (25分)

對給定的字串,本題要求你輸出最長對稱子串的長度。例如,給定Is PAT&TAP symmetric?,最長對稱子串為s PAT&TAP s,於是你應該輸出11。

輸入格式:

輸入在一行中給出長度不超過1000的非空字串。

輸出格式:

在一行中輸出最長對稱子串的長度。

輸入樣例:

Is PAT&TAP symmetric?

輸出樣例:

11
package String;

import java.util.Scanner;

public class LongestPalindrome {

	/*
	 * 最長迴文子串(動態規劃解決方法)
	 * 思路:pal陣列標記位於j~i之間串是否為迴文子串
	 * 若判斷j~i間是否為迴文子串,需依賴於 j+1 ~ i-1間子串型別,依此類推
	 * 直到依賴項為x或者xy,(x,y未知)(仔細體會為什麼是這樣)
	 * i-j<2 :用於判斷x或者xy的情況,當然不要忽略&&的短路效應
	 */
	public static int longestPalindrome(String str){
		int n=str.length();
		boolean[][] pal=new boolean[n][n];
		int maxLen=0;
		for(int i=0;i<n;i++){
			for(int j=i;j>=0;j--){ 
				if(str.charAt(i)==str.charAt(j) && (i-j<2 || pal[j+1][i-1]==true)){
					pal[j][i]=true;
					maxLen=Math.max(maxLen, i-j+1);
				}
			}
		}
		return maxLen;
	}

	public static void main(String[] args) {
		// Is PAT&TAP symmetric?     
		//result:11
		Scanner in = new Scanner(System.in);
		String str = in.nextLine();
		System.out.println(longestPalindrome(str));
	}
}