1. 程式人生 > 其它 >Leetcode:分割回文串

Leetcode:分割回文串

題目描述:給你一個字串 s,請你將 s 分割成一些子串,使每個子串都是 迴文串 。返回 s 所有可能的分割方案。

迴文串 是正著讀和反著讀都一樣的字串。
示例 1:
輸入:s = "aab"
輸出:[["a","a","b"],["aa","b"]]

示例 2:
輸入:s = "a"
輸出:[["a"]]

判斷迴文第一反應就是動態規劃
然後要把符合條件的迴文子串構成的陣列加入結果中,利用回溯,一般pop_back()會跟在迭代的後面

class Solution {
private:
    vector<vector<int>> f;
    vector<vector<string>> ret;
    vector<string> ans;
    int n;

public:
    void dfs(const string& s, int start) {
        if (start == n) {
            ret.push_back(ans);
            return;
        }
        //如果上一步沒有加入ret當中,證明後面還有字元沒有遍歷完
        for (int end = start; end < n; ++end) {
            //如果迴文陣列為true,則進行start的替換,否則繼續for 
            if (f[start][end]) {
            	//在判斷是否為迴文的數組裡,如果start~end內的字元能夠構成迴文
		//則把該欄位的字元進行切片 
                ans.push_back(s.substr(start, end - start + 1));
                //往字串的下一個走,看後面的字元是否能構成迴文串 
                dfs(s, end + 1);
                //會保留之前進入陣列的值 
                ans.pop_back();
            }
        }
    }

    vector<vector<string>> partition(string s) {
        n = s.size();
        //初始化為一個4x4的全1的二維矩陣 
        f.assign(n, vector<int>(n, true));
		
		//判斷是否為迴文子串,動態規劃 
        for (int j = 1; j < n; j++) {
            for (int i = 0; i < j; i++) {
                f[i][j] = (s[i] == s[j]) && f[i + 1][j - 1];
            }
        }
        dfs(s, 0);
        return ret;
    }
};