Leetcode:分割回文串
阿新 • • 發佈:2021-12-27
題目描述:給你一個字串 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; } };