C/C++教程

leetcode【中等】131、分割回文串

本文主要是介绍leetcode【中等】131、分割回文串,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

在这里插入图片描述
思路:
先用dp[i][j]记录字串是否回文
再dfs回溯

class Solution:
    def partition(self, s: str) -> List[List[str]]:
        length=len(s)
        dp=[[False]*length for _ in range(length)]
        for j in range(length):
            for i in range(j+1):
                if s[i]==s[j]:
                    if j-i<3:dp[i][j]=True
                    else:dp[i][j]=dp[i+1][j-1]
                else:dp[i][j]=False
        
        res=[]
        path=[]

        def dfs(i):
            if i==length:
                res.append(path[:])
                return
            for j in range(i,length):
                if dp[i][j]:
                    path.append(s[i:j+1])
                    dfs(j+1)
                    path.pop()
        dfs(0)
        return res
class Solution {
    public List<List<String>> partition(String s) {
        int len=s.length();
        boolean[][]dp=new boolean[len][len];
        isVaild(s,dp);

        List<List<String>> res = new ArrayList<>();
        dfs(s,dp,0,new ArrayList<>(),res);
        return res;

    }

    public void dfs(String s,boolean[][]dp,int i,ArrayList<String>path,List<List<String>> res){
        if(i==s.length()){
            res.add(new ArrayList<>(path));
            return;
        }
        for(int j=i;j<s.length();j++){
            if(dp[i][j]==true){
                path.add(s.substring(i,j+1));
                dfs(s,dp,j+1,path,res);
                path.remove(path.size()-1);
            }
        }
    }

    public void isVaild(String s,boolean[][]dp){
        int len=s.length();
        for(int j=0;j<len;j++){
            for(int i=0;i<=j;i++){
                if(s.charAt(i)==s.charAt(j)){
                    if(j-i<3) dp[i][j]=true;
                    else dp[i][j]=dp[i+1][j-1];
                }
            }
        }        
    }
}
这篇关于leetcode【中等】131、分割回文串的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!