力扣131.分割回文串

题目:
给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。
返回 s 所有可能的分割方案。

示例:

输入: “aab”
输出: [ [“aa”,“b”], [“a”,“a”,“b”] ]

分析:
有点向之前求所有子串问题,采用DP动态规划算法,只是多加上了判断是否为回文串, 在"aab" 一例中可以依次分析如下分割是否满足回文串特性:
a-a-b
a-ab
aa-b
aab
这些分割组合是通过回溯算法形成的

void getPartition(string s, vector temp, vector>& result) {
        if(s.length() == 0){
            result.push_back(temp);
        }
        else {
            for(int i = 1; i <= s.length(); i++) {
                string subs = s.substr(0, i);
                if(isPalindrome(subs)) {  
                    temp.push_back(subs);
                    getPartition(s.substr(i,s.length()), temp, result);
                    temp.pop_back();
                }
            }
        }
    }

每次从本次待分割子串的0/头位置开始依次查看长度(不超过子串长度)为1,2,3…的子串是否可以满足回文串要求,若满足,则继续分割剩下的子串,直到子串长度为0分割完毕放入result中( result.push_back(temp)),并依次回溯(temp.pop_back()),查看更长长度的子串是否满足回文串要求。

总体代码:

class Solution {
public:
    vector> partition(string s) {
        vector temp;
        vector> result;
        getPartition( s, temp, result);
        return result;
    }
    
    void getPartition(string s, vector temp, vector>& result) {
        if(s.length() == 0){
            result.push_back(temp);
        }
        else {
            for(int i = 1; i <= s.length(); i++) {
                string subs = s.substr(0, i);
                if(isPalindrome(subs)) {  
                    temp.push_back(subs);
                    getPartition(s.substr(i,s.length()), temp, result);
                    temp.pop_back();
                }
            }
        }
    }
    
    bool isPalindrome(string s) {
        transform(s.begin(),s.end(),s.begin(),::tolower);
        int i=0, j=s.length()-1;
        while(i < j) {
            if(s[i++] != s[j--]){
                return false;
            }
        }
        return true;
    }
};

22 / 22 个通过测试用例
状态:通过
执行用时:168 ms

你可能感兴趣的:(C++,面试刷题)