题解 | #密码截取#

密码截取

https://www.nowcoder.com/practice/3cd4621963e8454594f00199f4536bb1

import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while(in.hasNextLine()){
            String s = in.nextLine();
            int n = s.length();
            int maxLen = 0;
            for(int i=0 ; i<n ; ++i){
                int a = expand(s, i, i); //考虑奇数
                int b = expand(s,i,i+1); //考虑偶数情况
                maxLen = Math.max(maxLen, Math.max(a,b));
                
            }
            //System.out.println(maxLen);
            dp(s);
        }
    }

    public static int expand(String s, int left, int right){
        while(left>=0 && right<s.length()){
            char cL = s.charAt(left);
            char cR = s.charAt(right);
            if(cL == cR){
                --left;
                ++right;
            }
            else{
                break;
            }
        }
        return right-left-1;
    }

    public static void dp(String s){
        int n = s.length();
        boolean[][] dp = new boolean[n][n];
        for(int i=0 ; i<n ; ++i){
            dp[i][i] = true;
        }
        int maxLen = 1;
        for(int l=2 ; l<=n ; ++l){ //判断长度
            for(int i=0 ; i<n-l+1 ; ++i){
                char cL = s.charAt(i);
                char cR = s.charAt(i+l-1);
                if(cL == cR){
                    if(l<=3){
                        dp[i][i+l-1] = true;
                    }
                    else{
                        dp[i][i+l-1] = dp[i+1][i+l-2];
                    }
                }
                else{
                    dp[i][i+l-1] = false;
                }
                if(dp[i][i+l-1]){
                    maxLen = Math.max(l, maxLen);
                }
            }
        }
        System.out.println(maxLen);
    }
}

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

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