题解 | #密码截取#
密码截取
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]
边界就是每一个字符是回文