回文分割方案—DFS

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”]
]
分析:
先不考虑所有的情况,针对一个符合条件的划分,每一部分都是一个回文子串,而且各部分的长度不固定。也即每一部分都是原始字符串的一个子串,且满足回文条件。所有的划分都满足上述条件,所以这就启发我们首先判断原始字符串的任意子串是否为回文子串。判断一个字符串是否为回文串最简单的方法是对字符串进行遍历。得到回文子串的结果之后我们该如何利用去获得所有可能的划分呢?此时,该问题就变为一个典型的深度优先遍历问题,问题的解空间就是所有可能划分的划分树,我们只需要遍历所有的分支直到叶节点,即为一个可能的划分。

    vector<vector<string>> partition(string s) {
        vector<vector<string>> ans;
        if(s.empty())
           return ans;
        vector<string> vec;
        DFS(s, vec, ans);
        return ans;
    }
    void DFS(string s, vector<string> vec, vector<vector<string>>& ans) {
    if (s.size() < 1) {     //递归终止条件
        ans.push_back(vec);
        return;
    }
    for (int i = 0; i < s.size(); i++) {
        int start = 0;
        int end = i;
        while(start < end){
            if (s[start] == s[end]) {
                start++;
                end--;
            }
            else
                break;
        }
        if (end <= start) {     //当前字符串s中0-i是回文子串
            vec.push_back(s.substr(0, i + 1));
            string ss = s.substr(i + 1); //更新下一次递归时的字符串
            DFS(ss, vec, ans);
            vec.pop_back();
        }
    }
    return;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值