其实dfs就是第一层循环内递归
在这题中,用dfs判断以i起点的子串是否能划分成【所有划分都是回文串】,就是
1.【回文串划分】以i为起点的子串一次,找到边界j0, j1, j2, ...
2. 再次对每个j调用dfs判断余下的子串[j+1, ...]。
void isValidPart(str, i)
{
// termination
if(i == n)
{
ans.push_back(ans_part);
return;
}
// recursion
for(int j = i; j < n; ++j)
{
if(isPalindrome(str, i, j))
{
ans_part.push_back(str.substr(i, j - i + 1));
isValidPart(str, j + 1);
ans_part.pop_back();
}
}
dp关键思想就是递推式(由已知得未知)
在这题中,dp用来判断一个子串是否是回文串
dp[i][j] = (str[i] == str[j] && dp[i+1][j-1])
记忆化搜索是懒惰搜素,并记录搜索过程中产生的所有有用结果,迎合了dp的需求
在这题中,不适用遍历所有(i, j)来计算所有dp,仅当(i, j)需要被获取时才递归地计算并记录。
enum{TRUE, FALSE, NO_RECORED}
return dp[i][j] =
int isPalindrome(str, i, j)
{
if(dp[i][j])
return dp[i][j];
if(i >= j)
return dp[i][j] = true;
return dp[i][j] = (str[i] == str[j]) ? isPalindrome(str, i+1, j-1) : false;
}
原文:https://www.cnblogs.com/laiyk/p/14493702.html