L2-008 最长对称子串 (25分)附两个测试点

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

输入格式:

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

输出格式:

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

输入样例:

Is PAT&TAP symmetric?

输出样例:

11

NOTE:

这个题目与最长回文子串差不多,用动态规划,先初始化,考虑边界情况,最开始没判断之前初始边界为1。dp[i][j]表示第s[i]与是s[j]之间是否是回文字符串,如果是dp[i][j] = 1,不是就等于0;怎样判断s[i]与s[j]之间是回文字符串呢?只要s[i+1]与s[j-1]之间是回文字符串并且s[i]==s[j]。如果s[i]!=s[j],s[i]与s[j]之间是回文字符串

不过有两个测试点需要注意的,题目中说是非空字符串,所以输出的长度最小是1,不是0。

代码:


import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s = sc.nextLine();
        int cnt = 1;//因为是非空字符串,所以初始为1,不会有为0的情况
        int right = 0; int left = 0;
        int len = s.length();
       //题目中说的是非空字符串,不用考虑len = 0的情况
        int[][] dp = new int[len+1][len+1];
        for(int i = 0; i<len; i++){
            dp[i][i] = 1;
            if(i<len-1){
                if(s.charAt(i) == s.charAt(i+1)){
                    dp[i][i+1] = 1;
                    cnt = 2;
                    right = i;left = i+1;
                }
            }
        }
        
        //状态转移方程
        for(int L = 3; L<=len; L++){
            for(int i = 0; i+L-1<len; i++){
                int j = i+L-1;
                if(dp[i+1][j-1] == 1 && s.charAt(i) == s.charAt(j)){
                    dp[i][j] = 1;//更新
                    right = i;left = j;
                    cnt = L;
                }
            }
        }
   
        System.out.println(cnt);
        

    }
       

}

猜你喜欢

转载自blog.csdn.net/qq_44985985/article/details/108063495
今日推荐