题解 | #密码截取#

密码截取

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);
        String str = in.nextLine();
        int len = str.length();
        boolean[][] dp = new boolean[len][len];
        for (int i = 0; i < len; i++) {
            dp[i][i] = true;
        }
		 //步长可以从2开始也可以从1开始
        int lenIndex = 1;
        int result = 1;
        while (lenIndex < len) {
            for(int left=0;left<len;left++) {
				//左右边界,左边界移动,带动右边界移动一位
                int right = left+lenIndex;
                if(right>=len){
                    continue;
                }
				//不相等,肯定不会是回文
                    if(str.charAt(left)!=str.charAt(right)){
                        dp[left][right]=false;
                    }else {
					  //相等右两种情况是回文
					  //1、长度为1,2,3
					  //2 4,5,6.。。。。
                        if(right-left<3){
                            dp[left][right]=true;
                        }else {
                            if(right-1>=0 && right-1<len && left+1>=0 && left+1<len){
                                dp[left][right]=dp[left+1][right-1];
                            }

                        }
                    }
			  //路途当中计算回文
                    if(dp[left][right]){
                        result =Math.max(result,right-left+1);
                    }



            }
            lenIndex++;
                }

        System.out.println(result);

    }
}

1、设定步长 从2开始

2、设定做边界

3、获取有边界

左右边界相等?

左右边界不相等?

细节点就是如果j-i之间的距离<3,则只要str[i]==str[j],那么一定是回文。

剩下就是常规的dp

dp公式是

dp[i][j]=dp[i-1][j+1]

边界就是每一个字符是回文

全部评论

相关推荐

07-15 12:15
门头沟学院 Java
点赞 评论 收藏
分享
06-07 17:17
嘉兴学院 教师
单单人旁的佳:你是我见过最美的牛客女孩
点赞 评论 收藏
分享
程序员小白条:这比例牛逼,750:1
点赞 评论 收藏
分享
昨天 11:50
门头沟学院 Java
投递腾讯等公司7个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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