---
# System prepended metadata

title: 'LeetCode #131 [Palindrome Partitioning](https://leetcode.com/problems/palindrome-partitioning/)'
tags: [DFS, LeetCode, Medium, String]

---

###### tags: `LeetCode` `DFS` `Medium` `String`
# LeetCode #131 [Palindrome Partitioning](https://leetcode.com/problems/palindrome-partitioning/)
### (Medium)

給你一個字符串 s，請你將 s 分割成一些子串，使每個子串都是 回文串 。返回 s 所有可能的分割方案。

回文串 是正著讀和反著讀都一樣的字符串。

---

兩個重點:
1. 判斷字串是否為回文
2. 如何遍歷整個字串

判斷字串是否為回文的方法是將字串反轉, 然後比對反轉後的字串與原字串是否相等。

遍歷字串的方式:從長度1開始切割字串, 當切割的字串為回文時, 就將該回文字串存入暫存數組中, 並從下一個字元開始呼叫遞迴, 直到指標位置等於整個字串的長度, 此時將暫存數組存入答案數組中, 然後返回。而在整個迴圈遍歷完成後, 也需要返回。

需要注意的點是i的範圍從1到s.size()-pos。

---
```
class Solution {
public:
    vector<vector<string>> partition(string s) {
        vector<string> tmp;
        vector<vector<string>> ans;
        dfs(0, tmp, ans, s);
        return ans;
    }
    bool check(string s){
        string tmp = s;
        reverse(tmp.begin(), tmp.end());
        if(tmp==s)return true;
        return false;
    }
    void dfs(int pos, vector<string>& tmp, vector<vector<string>>& ans, const string& s){
        if(pos==s.size()){
            ans.push_back(tmp);
            return;
        }
        for(int i=1;i<=s.length()-pos;i++){
            string subs = s.substr(pos, i);
            if(!check(subs))continue;
            tmp.push_back(subs);
            dfs(i+pos, tmp, ans, s);
            tmp.pop_back();
        }
        return;
    }
};
```