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);
}
}
浙公网安备 33010602011771号