L2-008 最长对称子串 (25分)

Posted xuesujun

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了L2-008 最长对称子串 (25分)相关的知识,希望对你有一定的参考价值。

对给定的字符串,本题要求你输出最长对称子串的长度。例如,给定Is PAT&TAP symmetric?,最长对称子串为s PAT&TAP s,于是你应该输出11。

输入格式:

输入在一行中给出长度不超过1000的非空字符串。

输出格式:

在一行中输出最长对称子串的长度。

输入样例:

Is PAT&TAP symmetric?
 

输出样例:

11



思路:本题可以有多种方法来解决,动态规划,马拉车等等,但是我更擅长动态规划来解决此题,本题定义一个动态规划数组dp[i][j],表示的意义为字符串从i-j是否为回文串,首先应该确定数组的边界,当字串长度为1时一定为会文串,当
子串长度为2时只要判断s[i]是否等于s[j]就可以判断i-j是否为回文串,当字串的长度大于等于2时知道判定s[i]==s[j]和dp[i+1][j-1]>0就可判断是否为回文串,所以本题的状态公式为:
      1 i==j
dp[i][j]= 2 i-j==1&&str[i]==str[j]
   dp[j+1][i-1]+2 str[i]==str[j]&&dp[j+1][i-1]>0



代码:
/**
 * 
 */
package com.xingbing.tianti;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;

/**
 * @author 邢兵
 * @data
 * @description
 */
public class L2008 {
	public static void main(String[] args) throws IOException {
		Scanner in = new Scanner(System.in);
		BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
		String str = reader.readLine();
		int dp[][] = new int[str.length()][str.length()];
		int ans =0;
		for(int i=0;i<str.length();i++){
			for(int j=0;j<=i;j++){
				if(i==j){
					dp[j][i] = 1;
				}else if(i-j==1){
					if(str.charAt(i)==str.charAt(j)){
						dp[j][i] = 2;
					}
				}else if(i-j>=2){
					if(str.charAt(i)==str.charAt(j)&&dp[j+1][i-1]>0){
						dp[j][i] = dp[j+1][i-1]+2;
					}
				}
			}
		}
		for(int i=0;i<dp.length;i++){
			for(int j=0;j<dp[0].length;j++){
				ans = Math.max(ans, dp[i][j]);
			}
		}
		System.out.println(ans);
	}
}

  

以上是关于L2-008 最长对称子串 (25分)的主要内容,如果未能解决你的问题,请参考以下文章

C语言L2-008 最长对称子串 (25分)简单解法/附带思路

L2-008. 最长对称子串

L2-008. 最长对称子串

L2-008. 最长对称子串

天梯杯 L2-008. 最长对称子串(马拉车算法应用)

L2-008 最长对称子串(马拉车 or 技巧暴力)