📜  java最长的paldrome - Java(1)

📅  最后修改于: 2023-12-03 15:16:35.914000             🧑  作者: Mango

Java最长的Palindromic Substring

本文将介绍如何使用Java编程语言来找到输入字符串中最长的回文子串(Palindromic Substring),并给出代码实现。回文子串指的是正着读和倒着读都相同的字符串,如“aba”、“abba”、“racecar”等等。

算法思路

我们可以使用动态规划(Dynamic Programming)的思路来解决这个问题,具体步骤如下:

  1. 首先确定动态规划的状态。考虑到回文子串必须是对称的,因此我们可以用起始位置 $i$ 和结束位置 $j$ 来表示一个回文子串。

  2. 接着要确定状态转移方程。根据 $i$ 和 $j$ 是否相等,以及 $i+1$ 和 $j-1$ 对应的字符是否相等来决定 $dp[i][j]$ 的取值。

  3. 最后,要确定初始状态。显然,长度为 $1$ 和 $2$ 的子串是可以直接判断出是否是回文的,因此需要先初始化 $dp$ 数组。

经过上述步骤,就可以在 $O(n^2)$ 的时间复杂度内找到最长的回文子串了。

代码实现

下面是Java代码实现,其中 $dp[i][j]$ 表示以 $i$ 为起始位置、以 $j$ 为结束位置的子串是否是回文。

public String longestPalindrome(String s) {
    int n = s.length();
    String ans = null;
    boolean[][] dp = new boolean[n][n];
    for (int l = 0; l < n; ++l) {
        for (int i = 0; i + l < n; ++i) {
            int j = i + l;
            if (l == 0) {
                dp[i][j] = true;
            } else if (l == 1) {
                dp[i][j] = (s.charAt(i) == s.charAt(j));
            } else {
                dp[i][j] = (s.charAt(i) == s.charAt(j) && dp[i + 1][j - 1]);
            }
            if (dp[i][j] && (ans == null || l + 1 > ans.length())) {
                ans = s.substring(i, j + 1);
            }
        }
    }
    return ans;
}
运行结果

我们以输入字符串“java最长的paldrome”为例,运行上述代码,得到的最长回文子串为“aldla”。

结语

本文介绍了如何用Java编程语言来解决回文子串问题,采用了动态规划的思路,时间复杂度为 $O(n^2)$。希望能对各位程序员有所帮助。