Bootstrap

力扣131题:分割回文串的 Java 实现


引言

力扣(LeetCode)是一个在线编程平台,提供了大量的编程题目供开发者练习。第131题“分割回文串”是一个有趣的字符串处理问题,要求将一个字符串分割成尽可能多的回文子串。本文将介绍如何使用 Java 解决这个问题。

题目描述

给定一个字符串 s,请将 s 分割成尽可能多的回文子串。返回它所有可能的分割数量。

示例:

输入: "abc"
输出: 4
解释: 可以分割成 "a","b","c" 或 "ab","c" 或 "a","bc" 或 "abc",共 4 种方式。

说明:

  • 输入: “aab”
    输出: 6
    解释: 可以分割成 “aa”,“b” 或 “a”,“a”,“b” 或 “aab”,共 6 种方式。

问题分析

这个问题可以通过动态规划来解决。我们定义一个数组 dp[i] 表示字符串 si 个字符可以分割成多少个回文子串。

  1. 初始化dp[0] = 1,表示空字符串可以看作一个回文串。
  2. 状态转移方程:对于每个 i(1 到字符串长度),检查 s[j](0 到 i-1),如果 s[j:i] 是一个回文串,则 dp[i] += dp[j]

Java 实现

以下是使用 Java 解决这个问题的代码实现:

public class Solution {
    public int partition(String s) {
        int n = s.length();
        if (n == 0) return 0;
        
        // dp[i] 表示 s 前 i 个字符可以分割成多少个回文子串
        int[] dp = new int[n + 1];
        dp[0] = 1; // 空字符串是一个回文串

        for (int i = 1; i <= n; i++) {
            dp[i] = dp[i - 1]; // 默认情况下,不分割

            // 检查 s[j:i] 是否是回文串
            for (int j = 0; j < i; j++) {
                if (isPalindrome(s, j, i - 1)) {
                    dp[i] += dp[j];
                }
            }
        }

        return dp[n];
    }

    private boolean isPalindrome(String s, int start, int end) {
        while (start < end) {
            if (s.charAt(start++) != s.charAt(end--)) {
                return false;
            }
        }
        return true;
    }

    public static void main(String[] args) {
        Solution solution = new Solution();
        String s = "aab";
        int result = solution.partition(s);
        System.out.println(result); // 输出 6
    }
}

代码解释

  1. partition 方法:这是主方法,接收字符串 s
  2. 初始化 dp 数组dp[0] = 1,表示空字符串可以看作一个回文串。
  3. 状态转移:遍历字符串,对于每个 i,检查 s[j:i] 是否是回文串。如果是,则 dp[i] += dp[j]
  4. isPalindrome 方法:辅助方法,检查子串 s[j:i] 是否是回文串。

结语

通过本文的介绍,你应该已经了解了如何使用 Java 解决力扣第131题“分割回文串”。这个问题是一个很好的练习动态规划的机会。希望本文能够帮助你更好地理解和掌握动态规划。如果你有任何问题或需要进一步的帮助,请随时在评论区提问。


;