【LeetCode】131.Palindrome Partitioning迴文劃分

題目:

            


理解:即將一個字符串劃分成迴文子串,窮舉所有的可能。


分析:

           由我的LeetCode】 5.Longest Palindromic Substring最長迴文子串問題  這篇文章分析可知,判斷迴文子串的問題可以轉換爲一個動態規劃的問題,這裏我使用了動態規劃來找到所有的迴文子串,將其記錄到一個二維數組中,然後將這個數據轉化成一個等價圖,利用一個動態圖搜索算法來找到從起始節點到終止節點的路徑,每一個節點便是字符串的一個分割點,由此可以得到問題的解。


代碼:

<span style="font-size:12px;">class Solution {
public:
    vector<vector<string>> partition(string s) {
        int P[s.length()][s.length()];
       for(int i=0;i<s.length();i++)
                for(int j=0;j<s.length();j++)
                    P[i][j]=0;
        for(int i=0;i<s.length();i++)
            P[i][i]=1;
        for(int i=0;i<s.length()-1;i++)
        {
            if(s[i]==s[i+1])
                P[i][i+1]=1;
        }
        for(int len=3;len<=s.length();len++)
        {
            for(int i=0;i<s.length()-len+1;i++)
            {
                int j=i+len-1;
                if(P[i+1][j-1]==1&&s[i]==s[j])
                    P[i][j]=1;
            }
        }

        vector < vector<string> > table[s.length()+1];
        vector <string> tempPath;

        table[0].push_back(tempPath);
        for(int j=1;j<=s.length();j++)
        {
            for(int i=0;i<j;i++)//找到前置節點
            {
                if(P[i][j-1]==1)//若i爲其前置節點
                {
                    for(int k=0;k<table[i].size();k++)
                    {
                        vector<string> temp=table[i][k];
                        temp.push_back(s.substr(i,j-i));
                        table[j].push_back(temp);
                    }
                }
            }
        }
        return table[s.length()];
    }
};</span>



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章