97.交错字符串
不能用双指针,因为如果si和ti是同一个字母的话,就没法继续遍历
因此需要用动态规划
(dfs容易超时
- 确定dp数组(dp table)以及下标的含义
dp[i][j]:s的前i个字符和t的前j个字符是否能组成给定字符串的前i+j项 - 确定递推公式
dp[i][j]=(dp[i-1][j]&&s1[i-1]==s3[i+j-1])||(dp[i][j-1]&&s2[j-1]==s3[i+j-1]) - dp数组如何初始化
dp[0][0]=True
剩余都初始化为false - 确定遍历顺序
从左到右从上到下
for(int i=0;i<=s1.size();i++)
for(int j=0;j<=s2.size();j++)
{
if(i>0)
dp[i][j]|=(dp[i-1][j]&&s1[i-1]==s3[i+j-1]);
if(j>0)
dp[i][j]|=(dp[i][j-1]&&s2[j-1]==s3[i+j-1]);
}
- 举例推导dp数组
class Solution {
public:
bool isInterleave(string s1, string s2, string s3) {
if(s1.size()+s2.size()!=s3.size())
return false;
vector<vector<int>>dp (s1.size()+1,vector<int>(s2.size()+1,false));
dp[0][0]=true;
for(int i=0;i<=s1.size();i++)
for(int j=0;j<=s2.size();j++)
{
if(i>0)
dp[i][j]|=(dp[i-1][j]&&s1[i-1]==s3[i+j-1]);
if(j>0)
dp[i][j]|=(dp[i][j-1]&&s2[j-1]==s3[i+j-1]);
}
return dp[s1.size()][s2.size()];
}
};
98.验证二叉搜索树
中序遍历,看是否有序
class Solution {
public:
vector<int> vec;
void traversal(TreeNode* root)
{
if(root==nullptr)
return;
traversal(root->left);
vec.push_back(root->val);
traversal(root->right);
}
bool isValidBST(TreeNode* root) {
traversal(root);
for(int i=1;i<vec.size();i++)
{
if(vec[i-1]>=vec[i])
return false;
}
return true;
}
};