# LC 131. Palindrome Partitioning ### [Problem link](https://leetcode.com/problems/palindrome-partitioning/) ###### tags: `leedcode` `python` `c++` `medium` `Backtracking` Given a string <code>s</code>, partition <code>s</code> such that every **substring** of the partition is a **palindrome** . Return all possible palindrome partitioning of <code>s</code>. **Example 1:** ``` Input: s = "aab" Output: [["a","a","b"],["aa","b"]] ``` **Example 2:** ``` Input: s = "a" Output: [["a"]] ``` **Constraints:** - <code>1 <= s.length <= 16</code> - <code>s</code> contains only lowercase English letters. ## Solution 1 - Backtracking #### Python ```python= class Solution: def partition(self, s: str) -> List[List[str]]: path = [] res = [] def is_palindrome(left, right): while left < right: if s[left] != s[right]: return False left += 1 right -= 1 return True def backtrack(startIdx): if startIdx == len(s): res.append(path[:]) return for i in range(startIdx, len(s)): if is_palindrome(startIdx, i): path.append(s[startIdx : i + 1]) backtrack(i + 1) path.pop() backtrack(0) return res ``` #### C++ ```cpp= class Solution { public: vector<vector<string>> res; bool isPalindrome(string &s, int start, int end) { for (int i = start, j = end; i < j; i++, j--) { if (s[i] != s[j]) { return false; } } return true; } void backtracking(string &s, vector<string> &path, int startIdx) { if (startIdx == s.size()) { res.push_back(path); } for (int i = startIdx; i < s.size(); i++) { if (isPalindrome(s, startIdx, i)) { path.push_back(s.substr(startIdx, i - startIdx + 1)); backtracking(s, path, i + 1); path.pop_back(); } } } vector<vector<string>> partition(string s) { vector<string> path; backtracking(s, path, 0); return res; } }; ``` ```cpp= class Solution { public: bool isPalid(string& s, int left, int right) { while (left < right) { if (s[left] != s[right]) { return false; } left++; right--; } return true; } vector<vector<string>> partition(string s) { int n = s.size(); vector<vector<string>> ans; vector<string> path; function<void(int)> dfs = [&](int i) { if (i == n) { ans.push_back(path); return; } for (int j = i; j < n; j++) { if (isPalid(s, i, j)) { path.push_back(s.substr(i, j - i + 1)); dfs(j + 1); path.pop_back(); } } }; dfs(0); return ans; } }; ``` >### Complexity >n = s.length >| | Time Complexity | Space Complexity | >| ----------- | --------------- | ---------------- | >| Solution 1 | O(n*($2^n$)) | O($2^n$) | ## Note [代碼隨想錄](https://github.com/youngyangyang04/leetcode-master/blob/master/problems/0131.%E5%88%86%E5%89%B2%E5%9B%9E%E6%96%87%E4%B8%B2.md)