趋势科技笔试题——打印出最长回文串

923 阅读1分钟

打印出输入字符串中最长的回文串,如果有多个长度相等的回文串就都打印出来,如果没有回文串就输出null

package 趋势科技考试;

import java.util.Scanner;

public class Demo1 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String s = scanner.next();
        char[] arr = s.toCharArray();
        int n = arr.length;
        //用dp做
        //dp[i][j]代表arr[i]到arr[j]是否是回文串
        boolean[][] dp = new boolean[n][n];
        //1.初始化
        //先初始化每一个字符
        for (int i = 0; i < n; i++) {
            dp[i][i] = true;
        }
        //再判断相邻的字符
        for (int i = 0; i < n - 1; i++) {
            dp[i][i + 1] = arr[i] == arr[i + 1];
        }
        //状态转移
        //dp[i][j]依赖于dp[i+1][j-1]
        for (int i = n - 1; i >= 0; i--) {
            //相邻的已经判断过了,需要从j=i+2开始判断
            for (int j = i + 2; j < n; j++) {
                dp[i][j] = dp[i + 1][j - 1] && arr[i] == arr[j];

            }
        }
        int count = 0;
        int maxLen = 0;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                if (j - i >= 1 && dp[i][j]) {
                    maxLen = Math.max(j - i + 1, maxLen);
                    count++;
                }
            }
        }
        if (count == 0) {
            System.out.println("null");
        } else {
            for (int i = 0; i < n; i++) {
                for (int j = 0; j < n; j++) {
                    if (j - i + 1 == maxLen && dp[i][j]) {
                        System.out.println(s.substring(i, j + 1));
                    }
                }
            }
        }

    }

}