把一个字符串划分成几个回文子串,枚举所有可能的划分
例如
For example, given
s
=
"aab"
,
Return
[ ["aa","b"], ["a","a","b"] ]
写一个子函数判断是否为回文。
然后dfs,这个dfs比之前的稍微难理解一些。dfs函数每次输入的起点代表之前已经处理好了,从这个起点开始到结尾len的有几种长度可能组成,回文的都要dfs遍历一次,如果没有就++。例如输入为abcc,假设此时start指向b了,那么b是回文,要dfs从start+1开始,因为b的长度为1,一直继续。。。之后还要回到b开始长度为2的串也就是bc然后不是回文,再判断bcc不是回文。这里嵌套着的还是要好好理解。
class Solution { public : // 131 bool isPalindrome131( string str) { int len = str.size(); if (len <= 1 ) return true ; int i = 0 ; while (i <= len / 2 ) { if (str[i] != str[len - i - 1 ]) return false ; i ++ ; } return true ; } void dfs131(vector<vector< string > > &ans, vector< string > &tmp, string &s, int start) { int len = s.size(); if (start >= len) {ans.push_back(tmp); return ;} for ( int i = 1 ; i <= len - start; i++ ) if (isPalindrome131(s.substr(start, i))) { tmp.push_back(s.substr(start, i)); dfs131(ans, tmp, s, start + i); tmp.pop_back(); } } vector <vector< string > > partition( string s) { int len = s.size(); vector <vector< string > > ans; if (len == 0 ) return ans; vector < string > tmp; dfs131(ans, tmp, s, 0 ); return ans; } };