Leetcode-132.Palindrome Partitioning II [C++][Java]

目录

一、题目描述

二、解题思路

【C++】

【Java】


Leetcode-132.Palindrome Partitioning IIhttps://leetcode.com/problems/palindrome-partitioning-ii/description/132. 分割回文串 II - 力扣(LeetCode)132. 分割回文串 II - 给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是回文串。返回符合要求的 最少分割次数 。 示例 1:输入:s = "aab"输出:1解释:只需一次分割就可将 s 分割成 "aa","b" 这样两个回文子串。示例 2:输入:s = "a"输出:0示例 3:输入:s = "ab"输出:1 提示: * 1 <= s.length <= 2000 * s 仅由小写英文字母组成https://leetcode.cn/problems/palindrome-partitioning-ii/description/

一、题目描述

Given a string s, partition s such that every substring of the partition is a palindrome.

Return the minimum cuts needed for a palindrome partitioning of s.

Example 1:

复制代码
Input: s = "aab"
Output: 1
Explanation: The palindrome partitioning ["aa","b"] could be produced using 1 cut.

Example 2:

复制代码
Input: s = "a"
Output: 0

Example 3:

复制代码
Input: s = "ab"
Output: 1

Constraints:

  • 1 <= s.length <= 2000
  • s consists of lowercase English letters only.

二、解题思路

方法一

  • 时间复杂度:O(n⋅2^n)

  • 空间复杂度:O(n)

【C++】

cpp 复制代码
class Solution {
private:
    bool isPalindrome(const string& s, int l, int r) {
        while (l <= r) if (s[l++] != s[r--]) return false;
        return true;
    }

public:
    int minCut(string s) {
        vector<int> f(s.size(), INT_MAX);
        for (int i = 0; i < s.size(); ++i) {
            if (isPalindrome(s, 0, i)) {f[i] = 0;}
            else {
                for (int j = 0; j < i; ++j) {
                    if (isPalindrome(s, j + 1, i)) {
                        f[i] = min(f[i], f[j] + 1);
                    }
                }
            }
        }
        return f[s.size() - 1];
    }
};

【Java】

java 复制代码
class Solution {
    private boolean isPalindrome(String s, int l, int r) {
        while (l <= r) if (s.charAt(l++) != s.charAt(r--)) return false;
        return true;
    }

    public int minCut(String s) {
        int[] f = new int[s.length()];
        Arrays.fill(f, Integer.MAX_VALUE);
        for (int i = 0; i < s.length(); ++i) {
            if (isPalindrome(s, 0, i)) {f[i] = 0;}
            else {
                for (int j = 0; j < i; ++j) {
                    if (isPalindrome(s, j + 1, i)) {
                        f[i] = Math.min(f[i], f[j] + 1);
                    }
                }
            }
        }
        return f[s.length() - 1];
    }
}

方法二

  • 时间复杂度:O(n^2)

  • 空间复杂度:O(n^2)

【C++】

cpp 复制代码
class Solution {
public:
    int minCut(string s) {
        vector<vector<int>> isPalindrome(s.size(), vector<int>(s.size(), true));
        for (int i = s.size() - 1; i >= 0; --i) {
            for (int j = i + 1; j < s.size(); ++j) {
                isPalindrome[i][j] = (s[i] == s[j]) && isPalindrome[i + 1][j - 1];
            }
        }
        vector<int> f(s.size(), INT_MAX);
        for (int i = 0; i < s.size(); ++i) {
            if (isPalindrome[0][i]) {f[i] = 0;}
            else {
                for (int j = 0; j < i; ++j) {
                    if (isPalindrome[j + 1][i]) {
                        f[i] = min(f[i], f[j] + 1);
                    }
                }
            }
        }
        return f[s.size() - 1];
    }
};

【Java】

java 复制代码
class Solution {
    public int minCut(String s) {
        int[] f = new int[s.length()];
        boolean[][] isPalindrome = new boolean[s.length()][s.length()];
        for (int l = s.length() - 1; l >= 0; --l) {
            for (int r = l; r < s.length(); ++r) {
                isPalindrome[l][r] = (l == r)
                    ? true
                    : (s.charAt(l) == s.charAt(r)) && (l + 1 == r || isPalindrome[l + 1][r - 1]);
            }
        }
        for (int i = 0; i < s.length(); ++i) {
            f[i] = Integer.MAX_VALUE;
            if (isPalindrome[0][i]) {f[i] = 0;}
            else {
                for (int j = 0; j < i; ++j) {
                    if (isPalindrome[j + 1][i]) {
                        f[i] = Math.min(f[i], f[j] + 1);
                    }
                }
            }
        }
        return f[s.length() - 1];
    }
}
相关推荐
逸Y 仙X8 分钟前
文章五:Elasticsearch安全通信
java·大数据·安全·elasticsearch·搜索引擎·全文检索·jenkins
quan263118 分钟前
20260529,日常开发-查老数据全量更新闭坑
java·mysql·主从·主从延迟
大大杰哥20 分钟前
Java 日志框架详解:SLF4J + Logback 从入门到实战
java·开发语言·logback
莫等闲-29 分钟前
leetcode42. 接雨水 leetcode84.柱状图中最大的矩形
数据结构·c++·算法·leetcode
爱吃生蚝的于勒29 分钟前
QT开发第二章——信号和槽
c语言·开发语言·c++·qt
unicrom_深圳市由你创科技29 分钟前
历史数据存储量太大,怎么处理?数据压缩/归档策略?
算法
浅念-29 分钟前
LeetCode 记忆化搜索 刷题总结
数据结构·算法·leetcode·职场和发展·深度优先·dfs
Dest1ny-安全34 分钟前
2026最新CTF知识库:12大Web漏洞深度文章+1156篇历年大赛WP+50+脚本+Payload速查 +AI/RAG离线在线知识库
java·学习·安全·web安全·servlet
404号扳手35 分钟前
Java 基础知识(六)
java·后端
思麟呀41 分钟前
C++工业级日志项目(八)最终上层接口
开发语言·c++