题解 | #最长回文子串#

最长回文子串

https://www.nowcoder.com/practice/12e081cd10ee4794a2bd70c7d68f5507

import java.util.Objects;
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
   public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNextLine()) {
            String nextLine = in.nextLine();
            if (Objects.isNull(nextLine) || nextLine.equals("")) {
                break;
            }

            //Catcher是MCA国的情报员,他工作时发现敌国会用一些对称的密码进行通信,比如像这些ABBA,ABA,A,123321,
            // 但是他们有时会在开始或结束时加入一些无关的字符以防止别国破解。比如进行下列变化 ABBA->12ABBA,ABA->ABAKK,123321->51233214 。
            // 因为截获的串太长了,
            // 而且存在多种可能的情况(abaaab可看作是aba,或baaab的加密形式),
            // Cathcer的工作量实在是太大了,他只能向电脑高手求助,你能帮Catcher找出最长的有效密码串吗?

            // 使用动态规划记录情况 注意动态规划是从内往外扩,也就是i是向右,j是向左
            String res = "";
            boolean[][] dp = new boolean[nextLine.length() + 1][nextLine.length() + 1];
            for (int i = 0; i < nextLine.length(); i++) {
                for (int j = i; j >= 0; j--) {
                    // 前提是首尾一样,并且上一次是回文,如果截取长度小于3 就不用看上一次了,因为它就是首次
                    char end = nextLine.charAt(i);
                    char begin = nextLine.charAt(j);
                    dp[i][j] = end == begin && (i - j < 3 || dp[i - 1][j + 1]);
                    if (dp[i][j] && (i + 1 - j) > res.length()) {
                        res = nextLine.substring(j, i + 1);
                    }
                }
            }
            System.out.println(res.length());

        }
    }
}

全部评论

相关推荐

不愿透露姓名的神秘牛友
10-09 16:39
已编辑
英俊的靓仔offer...:我感觉吧第二个寻迹小车的项目有点配不上你的学历了,写上去扣分了都可能对你来说,好歹是211硕士嘛,写在我这种二本混子的简历上还说得过去,个人观点哦,能再有个好点的项目应该会好很多,或者干脆不写第二个换个啥实习经历?
点赞 评论 收藏
分享
WhiteAlbum...:学院本2中大厂垂直实习➕acm比赛 秋招0面试
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务