【ALGO】Leetcode 131.分割回文串

Navigator

题目

给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。
回文串 是正着读和反着读都一样的字符串。
链接

解析

建立二维判定数组,进行暴搜求解

代码

class Solution {
    
    
public:
    vector<vector<bool>> f; // 如果子串s[i..j]为回文串, 那么f[i][j]=true
    vector<vector<string>> ans; // 记录所有方案
    vector<string> path; // 当前搜索的路径
    vector<vector<string>> partition(string s) {
    
    
        int n = s.size();
        f = vector<vector<bool>>(n, vector<bool>(n));
        // 初始化判定数组
        for(int j=0; j<n; ++j)
            for(int i=0; i<=j; ++i)
                if(i==j) f[i][j]=true; // 如果是仅有1个字符的情况, 则必然为true
                else if(s[i]==s[j]){
    
    
                    if(i+1>j-1 || f[i+1][j-1]) f[i][j]=true;
                }
        
        dfs(s, 0);
        return ans;
    }

    void dfs(string &s, int k){
    
    
        if(k==s.size()) ans.push_back(path);
        else{
    
    
            for(int i=k; i<s.size(); ++i)
                if(f[k][i]){
    
    
                    // 如果找到子串为回文串
                    path.push_back(s.substr(k, i-k+1));
                    dfs(s, i+1);
                    path.pop_back();
                }
        }
    }
};
class Solution:
    ans = []
    path = []
    def partition(self, s: str) -> List[List[str]]:
        n = len(s)
        self.ans=[] # 清空类变量
        self.path=[]
        self.f = [[False for _ in range(n)] for _ in range(n)]
        for j in range(n):
            for i in range(j+1):
                if i==j: self.f[i][j]=True
                elif s[i]==s[j]:
                    if i+1>j-1 or self.f[i+1][j-1]:
                        self.f[i][j]=True
        self.dfs(s, 0)
        return self.ans
    def dfs(self, s, k):
        if k==len(s): 
            self.ans.append(list(self.path))
        else:
            for i in range(k, len(s)):
                if self.f[k][i] is True: 
                    self.path.append(str(s[k:i+1]))
                    self.dfs(s, i+1)
                    self.path.pop()

猜你喜欢

转载自blog.csdn.net/qq_18822147/article/details/118256537