赞
踩
leetcode131.分割回文串
class Solution { private: vector<string> path; vector<vector<string>> result; void backtracking(int startIndex,string s){//1.确定函数的参数和返回值 //2.确定递归的终止条件,并添加结果 if(startIndex>=s.size()){ result.push_back(path); return ; } //3.确定单层的循环逻辑 for(int i=startIndex;i<s.size();i++){ if(isPalindrome(s,startIndex,i)){//处理节点 path.push_back(s.substr(startIndex,i-startIndex+1)); }else{ continue; } backtracking(i+1,s);//递归 path.pop_back();//回溯 } } //判断是不是回文子串 bool isPalindrome(const string& s,int startIndex,int endIndex){ for(int i=startIndex,j=endIndex;i<j;i++,j--){ if (s[i]!=s[j]) return false; } return true; } public: vector<vector<string>> partition(string s) { backtracking(0,s); return result; } };
注意点:
如果一旦有一个不是回文串了记得continue继续留在本层向后遍历
,就不要到递归到下一层去了,因为题目要求的是所有子串均为回文子串,否则会有RunTimeError vector容器会爆内存(vector会不断扩容),并且这也不符合题意不是么。path.push_back(s.substr(startIndex,i-startIndex+1));
c++ substr方法定义是 截取startIndex包括start以后的多少个字符,明显从s[startIndex]到s[i]有i-startIndex+1个字符;Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。