题解 | #密码截取# 分类讨论,使用一维dp数组
密码截取
https://www.nowcoder.com/practice/3cd4621963e8454594f00199f4536bb1
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); String str = in.nextLine(); char[] arr = str.toCharArray(); int n = arr.length; int[] dp = new int[n];//dp[i]表示arr[i]结尾的最大有效密码串长度 //初始化 for (int i = 0; i < n; i++) { dp[i] = 1; } int max = 0; //一大堆分类讨论,比较繁琐,因为一开始没想出原来用二维dp数组 for (int i = 1; i < n; i++) { if (dp[i - 1] == 1) { //AA if (arr[i] == arr[i - 1]) { dp[i] = 2; } //ABA if (i - 2 >= 0 && arr[i] == arr[i - 2]) { dp[i] = 3; } } else { //AAA if (i - 2 >= 0 && arr[i] == arr[i - 2]) { dp[i] = 3; } int left = i - dp[i - 1] - 1; //AAAA if (dp[i - 1] == 3 && arr[i - 1] == arr[i - 2] && arr[i] == arr[i - 1]) { dp[i] = 4; } //通用情况, A[...]A if (left >= 0 && arr[left] == arr[i]) { dp[i] = dp[i - 1] + 2; } } max = Math.max(max, dp[i]); } System.out.println(max); } }