leetcode每日一题40

97.交错字符串

不能用双指针,因为如果si和ti是同一个字母的话,就没法继续遍历
因此需要用动态规划
(dfs容易超时

  1. 确定dp数组(dp table)以及下标的含义
    dp[i][j]:s的前i个字符和t的前j个字符是否能组成给定字符串的前i+j项
  2. 确定递推公式
    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])
  3. dp数组如何初始化
    dp[0][0]=True
    剩余都初始化为false
  4. 确定遍历顺序
    从左到右从上到下
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]);
	}
  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;
    }
};

你可能感兴趣的:(leetcode,算法,动态规划)