LeetCode(Palindrome Partitioning)

Palindrome Partitioning
深搜一:

class Solution {
public:
    vector<vector<string> > partition(string s) {
        vector<vector<string> > result;
        vector<string> path;
        dfs(s,result,path,0,1);
        return result;
    }
    //s[0..i-1]已经处理;考虑s[j-1]和s[j]之间是否断开。
    void dfs(string &s,vector<vector<string> > &result,vector<string> &path,int i,int j)
    {
        if(j==s.size())
        {
            if(isPalindrome(s,i,j-1))
            {
                path.push_back(s.substr(i,j-i));
                result.push_back(path);
                path.pop_back();
            }
            return;
        }
        dfs(s,result,path,i,j+1);
        if(isPalindrome(s,i,j-1))
        {
            path.push_back(s.substr(i,j-i));
            dfs(s,result,path,j,j+1);
            path.pop_back();
        }
    }
    bool isPalindrome(string &s,int i,int j)
    {
        while(i<j&&s[i]==s[j])
        {
            ++i;
            --j;
        }
        return i>=j;
    }
};

深搜二:

class Solution {
public:
    vector<vector<string> > partition(string s) {
        vector<vector<string> > result;
        vector<string> path;
        dfs(s,result,path,0);
        return result;
    }
    //考虑以s[i]开头的划分方案。
    void dfs(string &s,vector<vector<string> > &result,vector<string> &path,int i)
    {
        if(i==s.size())
        {
            result.push_back(path);
            return;
        }
        for(int j=i;j<s.size();++j)
        {
            if(isPalindrome(s,i,j))
            {
                path.push_back(s.substr(i,j-i+1));
                dfs(s,result,path,j+1);
                path.pop_back();
            }
        }
    }
    bool isPalindrome(string &s,int i,int j)
    {
        while(i<j&&s[i]==s[j])
        {
            ++i;
            --j;
        }
        return i>=j;
    }
};

动规一:

class Solution {
public: 
    vector<vector<string> > partition(string s) {
        int n=s.size();
        vector<vector<bool> > f(n,vector<bool>(n,false));
        for(int j=0;j<n;++j)
        {
            for(int i=j;i>=0;--i)f[i][j]=(s[i]==s[j]&&((j-i<2)||f[i+1][j-1]));
        }
        //subPalindrome[j]表示s[0..j]的划分。
        vector<vector<vector<string> > > subPalindrome(n);
        for(int j=0;j<n;++j) 
        {
            for(int i=j;i>=0;--i)
            {
                if(f[i][j]) 
                {
                    string t=s.substr(i,j-i+1);
                    if(i-1>=0) 
                    {
                        for(auto v : subPalindrome[i-1]) 
                        {
                            v.push_back(t);
                            subPalindrome[j].push_back(v);
                        }
                    }     
                    else subPalindrome[j].push_back(vector<string>{t});
                }
            }
        }
        return subPalindrome[n-1];
    }
};

动规二:

class Solution {
public:
    vector<vector<string> > partition(string s) {
        int n=s.size();
        vector<vector<bool> > f(n,vector<bool>(n,false));
        for(int i=n-1;i>=0;--i)
        {
            for(int j=i;j<n;++j)f[i][j]=(s[i]==s[j]&&((j-i<2)||f[i+1][j-1]));
        }
        //subPalindrome[i]表示s[i..n]的划分。
        vector<vector<vector<string> > > subPalindrome(n);
        for(int i=n-1;i>=0;--i) 
        {
            for(int j=i;j<n;++j)
            {
                if(f[i][j]) 
                {
                    string t=s.substr(i,j-i+1);
                    if(j+1<n) 
                    {
                        for(auto v : subPalindrome[j+1]) 
                        {
                            v.insert(v.begin(),t);
                            subPalindrome[i].push_back(v);
                        }
                    }     
                    else subPalindrome[i].push_back(vector<string>{t});
                }
            }
        }
        return subPalindrome[0];
    }
};

Palindrome Partitioning II

动规一:

class Solution {
public:
    int minCut(string s) {
        int n=s.size();
        //f[j]表示s[0..j]的最小划分数。
        vector<int> f(n);
        for(int j=0;j<n;++j)f[j]=j;
        vector<vector<bool> > g(n,vector<bool>(n,false));
        for(int j=0;j<n;++j)
        {
            for(int i=j;i>=0;--i)
            {
                if(s[i]==s[j]&&((j-i<2)||g[i+1][j-1]))
                {
                    g[i][j]=true;
                    f[j]=min(f[j],(i-1>=0?f[i-1]:-1)+1);
                }
            }
        }
        return f[n-1];
    }
};

动规二:

class Solution {
public:
    int minCut(string s) {
        int n=s.size();
        //f[i]表示s[i..n-1]的最小划分数。
        vector<int> f(n);
        for(int i=0;i<n;++i)f[i]=n-1-i;
        vector<vector<bool> > g(n,vector<bool>(n,false));
        for(int i=n-1;i>=0;--i)
        {
            for(int j=i;j<n;++j)
            {
                if(s[i]==s[j]&&((j-i<2)||g[i+1][j-1]))
                {
                    g[i][j]=true;
                    f[i]=min(f[i],(j+1<n?f[j+1]:-1)+1);
                }
            }
        }
        return f[0];
    }
};

你可能感兴趣的:(LeetCode(Palindrome Partitioning))