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