---
# System prepended metadata

title: 131-Palindrome Partitioning
tags: [Medium]

---

# 131-Palindrome Partitioning
###### tags: `Medium`
* Question:
https://leetcode.com/problems/palindrome-partitioning/

>Key:
1. 如何檢查回文?
2. 如何避免重複回文組合放入陣列?
3. Backtracking
每個子字串都是由字串選跟不選所組成，加上每次迭代都會檢查是否為回文，因此最後遞迴結果一定是回文

>Reference:
https://medium.com/@ChYuan/leetcode-131-palindrome-partitioning-%E5%BF%83%E5%BE%97-medium-1d5a8d6240f6

## Backtracking Solution
```cpp=
class Solution {
public:
    vector<vector<string>> partition(string s) {
        vector<vector<string>> result;
        vector<string> path;
        partition(s, 0, path, result);//dfs calls
        return result;
    }
private: 
    //DFS steps
    void partition(string& s, int start, vector<string>& path, vector<vector<string>>& result) {
        int n = s.length();
        if (start == n) {
            result.push_back(path);
        } else {
            for (int i = start; i < n; i++) {
                if (isPalindrome(s, start, i)) {
                    path.push_back(s.substr(start, i - start + 1));
                    partition(s, i + 1, path, result);
                    path.pop_back();
                }
            }
        }
    }
    //helper function to safe check whether a substr is palindrome or not
    bool isPalindrome(string& s, int l, int r) {
        while (l < r) {
            if (s[l++] != s[r--]) {
                return false;
            }
        }
        return true;
    }
};
```

* Note:
1. string STL的substr用法
https://crmne0707.pixnet.net/blog/post/316362030-c%2B%2B-%E5%AD%90%E5%AD%97%E4%B8%B2-substring