切割回文串

题目

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

回文串 是正着读和反着读都一样的字符串。

示例 1:

输入:s = "aab"
输出:[["a","a","b"],["aa","b"]]
示例 2:

输入:s = "a"
输出:[["a"]]

提示:

1 <= s.length <= 16
s 仅由小写英文字母组成

思路

  • 首先我们要搞清楚什么是回文串,也就是这个字符串按照中心对称的
  • 其次我们要明白什么时候该结束回溯,应该是在切到最后一位的时候,那什么时候表示到了最后一位呢,其实就是startIndex到了s.size()的位置,表示为startIndex >= s.size()
  • 最后是明白什么时候我们的path应该收录这个回文串,也就是在收录之前要判断一下是不是回文串

代码


class Solution {
public:
    vector<vector<string>> result;
	vector<string> path;
	bool ispail(string& s, int begin, int end) {//判断是不是回文串
        for(; begin <= end; begin++,end--){	
			if(s[begin] != s[end]) {
			return false;
			}
		}
    	return true;
    }

    void backing(string& s, int startIndex){
		if(startIndex >= s.size()){
			result.push_back(path);
            return;
		}
        for(int i = startIndex; i < s.size(); i++) {
		if(ispail(s, startIndex, i)){//被path收录之前应该判断一下是不是回文串
		    string str = s.substr(startIndex, i - startIndex + 1);
                    path.push_back(str);
                    backing(s, i + 1);
                    path.pop_back();
		}
	}
}
    vector<vector<string>> partition(string s) {
	backing(s,0);
        return result;
    }
};

posted @ 2023-04-07 16:32  铜锣湾陈昊男  阅读(7)  评论(0)    收藏  举报