最长回文子串【Java实现】
题目描述
现有一个字符串
s
,求s
的最长回文子串的长度
输入描述
一个字符串
s
,仅由小写字母组成,长度不超过100
输出描述
输出一个整数,表示最长回文子串的长度
样例
输入
lozjujzve
输出
// 最长公共子串为zjujz,长度为5
5
思路分析
- 长度由
0~n
的字符串都可能是回文子串,若要使得下标[i,j]
指向的字符串是回文子串,则必须保证下标[i+1,j-1]
指向的字符串是回文子串,这说明回文子串内部存在一定依赖关系,由此可以考虑使用动态规划 - 设置数组
dp[n][n]
,其中n
是字符串长度,dp[i][j]==true
代表下标[i,j]
指向的字符串arr[]
是回文字符串- 易知,
dp[i][i]
初始为true
,因为长度为1
的字符串一定是回文字符串 - 进入二重循环,第一重定义当前要判断的回文字符串长度,第二重确定当前字符串的起始下标
i
与终止下标j
- 如果
arr[i]==arr[j]
,那么说明当前[i,j]
有可能是回文子串,需要由dp[i+1][j-1]
是否为true
决定 - 其中有一种特殊情况,即
i+1==j
,此时说明当前判断的回文子串长度为2
,此时首尾字符又相等,那么当前一定是回文子串 - 每次确定下一个回文子串后就更新最大长度
max
- 易知,
- 最后输出结果
max
即可
代码实现
import java.util.Arrays;
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);char[] arr = scanner.next().toCharArray();boolean dp[][] = new boolean[arr.length][arr.length];for (int i = 0; i < arr.length; i++) {// 长度为 1 一定是回文串dp[i][i] = true;}int max = 1;for (int len = 2; len <= arr.length; len++) {for (int i = 0; i + len - 1 < arr.length; i++) {// i 指向字符串开头元素,j 指向字符串最后一个元素int j = i + len - 1;// 当前首尾元素相同,并且原来中间部分也是回文串,则当前字符串是回文串// 当首尾元素相同且字符串长度为 2 时,当前字符串也是回文串if (arr[i] == arr[j] && (i + 1 == j || dp[i + 1][j - 1])) {dp[i][j] = true;max = len;}}}System.out.println(max);}}