JAVA找出字符串中最长的回文字符串
前言
回文字符串是指正读和反读都一样的字符串。例如,"level"、"madam"、"racecar"都是回文字符串。在处理字符串的算法中,经常需要找出给定字符串中的最长回文字符串。本文将介绍如何使用JAVA编程语言来找出一个字符串中最长的回文字符串,并提供相应的代码示例。
回文字符串的判断方法
要找出字符串中的最长回文字符串,首先需要判断一个字符串是否为回文字符串。常见的判断方法有两种:暴力法和动态规划法。
暴力法
暴力法是一种比较直接的方法,它的思路是遍历字符串的所有可能子串,然后逐个判断是否为回文字符串。具体步骤如下:
- 遍历字符串的所有可能子串,包括单个字符和相邻两个字符。
- 对每个子串进行判断,判断方法是比较字符串的首尾字符是否相同,然后逐步向中间移动判断。
- 如果一个子串是回文字符串,记录下其长度和起始位置。
- 遍历完所有子串后,找出长度最长的回文字符串。
下面是使用JAVA实现暴力法的代码示例:
public String longestPalindrome(String s) {
int n = s.length();
int maxLength = 0;
int start = 0;
for (int i = 0; i < n; i++) {
for (int j = i; j < n; j++) {
int len = j - i + 1;
boolean isPalindrome = true;
for (int k = 0; k < len / 2; k++) {
if (s.charAt(i + k) != s.charAt(j - k)) {
isPalindrome = false;
break;
}
}
if (isPalindrome && len > maxLength) {
maxLength = len;
start = i;
}
}
}
return s.substring(start, start + maxLength);
}
动态规划法
动态规划法是一种更高效的方法,它利用了回文字符串的特点,将问题拆分为子问题,并利用子问题的解来求解原问题。具体步骤如下:
- 定义一个二维数组
dp
,其中dp[i][j]
表示字符串从第i
个字符到第j
个字符是否为回文字符串。 - 初始化
dp
数组,对角线上的元素为true
,表示单个字符都是回文字符串。 - 根据状态转移方程
dp[i][j] = dp[i+1][j-1] && s.charAt(i) == s.charAt(j)
,求解所有子问题并填充dp
数组。 - 找出
dp
数组中值为true
且长度最长的回文字符串。
下面是使用JAVA实现动态规划法的代码示例:
public String longestPalindrome(String s) {
int n = s.length();
boolean[][] dp = new boolean[n][n];
int maxLength = 0;
int start = 0;
for (int i = 0; i < n; i++) {
dp[i][i] = true;
if (i < n - 1 && s.charAt(i) == s.charAt(i + 1)) {
dp[i][i + 1] = true;
maxLength = 2;
start = i;
}
}
for (int len = 3; len <= n; len++) {
for (int i = 0; i < n - len + 1; i++) {
int j = i + len - 1;
if (s.charAt(i) == s.charAt(j) && dp[i + 1][j - 1]) {
dp[i][j] = true;
if (len > maxLength) {
maxLength = len;
start = i;
}
}
}
}
return s.substring(start, start + maxLength);
}
寻找字符串中最长的回文字符串
有了判断回文字符串的方法,下面我们将介绍如何寻找一个字符串中最长的回文字符串。
中心扩散法
中心扩散法是一种常用的寻找回文字符串的方法。具体步骤如下:
- 遍历字符串的