LeetCode算法题131:分割回文串解析

给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。

返回 s 所有可能的分割方案。

示例:

输入: "aab"
输出:
[
  ["aa","b"],
  ["a","a","b"]
]

这个题还是用DFS的方法来做,基本思路就是寻找子串的思路,只需要加一个函数来判断是否是回文串即可。

C++源代码:

class Solution {
public:
    vector<vector<string>> partition(string s) {
        vector<vector<string>> res;
        vector<string> out;
        DFS(s, 0, out, res);
        return res;
    }
    void DFS(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(!isPalindrom(s, start, i)) continue;
            out.push_back(s.substr(start, i-start+1));
            DFS(s, i+1, out, res);
            out.pop_back();
        }
    }
    bool isPalindrom(string s, int start, int end){
        while(start<end){
            if(s[start]!=s[end]) return false;
            start++;
            end--;
        }
        return true;
    }
};

python3源代码:

class Solution:
    def partition(self, s: str) -> List[List[str]]:
        res = []
        out = []
        self.DFS(s, 0, out, res)
        return res
    def DFS(self, s, start, out, res):
        if start==len(s):
            res.append(copy.deepcopy(out))
            return
        for i in range(start, len(s)):
            if self.isPalindrom(s, start, i)==False:
                continue
            out.append(s[start:i+1])
            self.DFS(s, i+1, out, res)
            out.pop()
    def isPalindrom(self, s, start, end):
        while start<end:
            if s[start]!=s[end]:
                return False
            start += 1
            end -= 1
        return True

猜你喜欢

转载自blog.csdn.net/x603560617/article/details/88051581