LeetCode 0131. 分割回文串

Posted Tisfy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 0131. 分割回文串相关的知识,希望对你有一定的参考价值。

【LetMeFly】131.分割回文串:暴力解法

力扣题目链接:https://leetcode.cn/problems/palindrome-partitioning/

给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。

回文串 是正着读和反着读都一样的字符串。

 

示例 1:

输入:s = "aab"
输出:[["a","a","b"],["aa","b"]]

示例 2:

输入:s = "a"
输出:[["a"]]

 

提示:

  • 1 <= s.length <= 16
  • s 仅由小写英文字母组成

方法一:状态压缩,暴力解法

字符串的长度最大为16, 2 1 6 × 16 = 1 , 048 , 576 2^16\\times 16=1,048,576 216×16=1,048,576,可在 1 s 1s 1s内解决。

因此不如枚举“分割位置”,然后判断分割后的子串是否都是回文串。

因为长度为 n n n的字符串最多切 n − 1 n-1 n1刀,那么我们可以用 i i i 0 0 0 2 n − 1 2^n-1 2n1枚举切割状态。

如果二进制下 i i i的第 j j j位为 1 1 1,那么就在原字符串第 i + 1 i+1 i+1个字符后面切一刀。

  • 时间复杂度 O ( 2 n × n ) O(2^n\\times n) O(2n×n),其中 n n n是字符串的长度
  • 空间复杂度 O ( n ) O(n) O(n),只需要把某次的切割结果存起来(答案不计入算法空间复杂度)

AC代码

C++

class Solution 
private:
    inline bool ok(string& s) 
        for (int i = 0; i < s.size() / 2; i++) 
            if (s[i] != s[s.size() - i - 1])
                return false;
        
        return true;
    
public:
    vector<vector<string>> partition(string s) 
        int n = s.size() - 1;  // 不如n直接-1
        vector<vector<string>> ans;
        for (int i = 0; i < (1 << n); i++)   // 枚举切割状态
            int lastLoc = 0;
            vector<string> thisSplited;
            string thisStr;
            for (int j = 0; j < n; j++)   // 看第j位是否为1
                if (i & (1 << j)) 
                    thisStr = s.substr(lastLoc, j + 1 - lastLoc);
                    if (!ok(thisStr)) 
                        goto loop;
                    
                    thisSplited.push_back(thisStr);
                    lastLoc = j + 1;
                
            
            thisStr = s.substr(lastLoc, s.size() - lastLoc);  // 切k刀会生成k+1个子串,记得把最后一个子串统计进来
            if (!ok(thisStr))
                goto loop;
            thisSplited.push_back(thisStr);
            ans.push_back(thisSplited);
            loop:;
        
        return ans;
    
;

同步发文于CSDN,原创不易,转载请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/125946017

以上是关于LeetCode 0131. 分割回文串的主要内容,如果未能解决你的问题,请参考以下文章

分割回文串,编辑距离,不同子序列

LeetCode-131-分割回文串

LeetCode 131. 分割回文串(Palindrome Partitioning)

《LeetCode之每日一题》:246.分割回文串

LeetCode 131. 分割回文串(Palindrome Partitioning)

Leetcode刷题Python131. 分割回文串