[LeetCode] Palindrome Partitioning 拆分迴文串
阿新 • • 發佈:2018-12-27
Given a string s, partition s such that every substring of the partition is a palindrome.
Return all possible palindrome partitioning of s.
For example, given s = "aab"
,
Return
[ ["aa","b"], ["a","a","b"] ]
這又是一道需要用DFS來解的題目,既然題目要求找到所有可能拆分成迴文數的情況,那麼肯定是所有的情況都要遍歷到,對於每一個子字串都要分別判斷一次是不是迴文數,那麼肯定有一個判斷迴文數的子函式,還需要一個DFS函式用來遞迴,再加上原本的這個函式,總共需要三個函式來求解。程式碼如下:
class Solution { public: vector<vector<string>> partition(string s) { vector<vector<string>> res; vector<string> out; partitionDFS(s, 0, out, res); return res; } void partitionDFS(string s, int start, vector<string> &out, vector<vector<string>> &res) { if (start == s.size()) { res.push_back(out); return; } for (int i = start; i < s.size(); ++i) { if (isPalindrome(s, start, i)) { out.push_back(s.substr(start, i - start + 1)); partitionDFS(s, i + 1, out, res); out.pop_back(); } } } bool isPalindrome(string s, int start, int end) { while (start < end) { if (s[start] != s[end]) return false; ++start; --end; } return true; } };
那麼,對原字串的所有子字串的訪問順序是什麼呢,如果原字串是 abcd, 那麼訪問順序為: a -> b -> c -> d -> cd -> bc -> bcd-> ab -> abc -> abcd, 這是對於沒有兩個或兩個以上子迴文串的情況。那麼假如原字串是 aabc,那麼訪問順序為:a -> a -> b -> c -> bc -> ab -> abc -> aa -> b -> c -> bc -> aab -> aabc,中間當檢測到aa時候,發現是迴文串,那麼對於剩下的bc當做一個新串來檢測,於是有 b -> c -> bc,這樣掃描了所有情況,即可得出最終答案。