力扣周赛250期(上)

337 阅读1分钟

这是我参与8月更文挑战的第9天,活动详情查看:8月更文挑战

1935. 可以输入的最大单词数

截屏2021-08-09 下午7.29.41.png

思路分析

这道题的逻辑就是判断每个单词中是否包含损坏的单词,可以使用字符串find函数来查询。但是这样会增加时间复杂度,所以这里我们将键盘损坏的字母键存入数组中。接下来是每个单词的判断,虽然可以按照空格分为多个单词数组,所以可以利用单空格的条件计数

int ret = 0;
int tmp = 0;
for(int i = 0; i < text.size(); i ++){
    if( text[i] == ' '){
        if (tmp == 0)ret++;
        tmp = 0;
    }else{
        if(arr[text[i] - 'a'] != 0){
            tmp = 1;
        }
    }
}
if (tmp == 0)ret++;
return ret;

今天力扣官网不知道为什么崩了,我也没有存稿,所以写一道acwing

18. 重建二叉树

截屏2021-08-09 下午8.38.34.png

思路分析

这道题在考研中经常做选择,根据前序序列和中序序列推断后序序列(也可能是其他的两个推断一个)。

以这题为例,在中序的对应前序的第一个节点的点的左边,一定是左子树,右边一定是右子树,这个是我们做题之前先明确的。 假设左子树的中序遍历的长度是 l,则在前序遍历中,根节点后面的 l 个数,是左子树的节点。剩下的数是右子树的节点。 以此类推,不断递归,求出左右子树,再创建根结点。

TreeNode* dfs(vector<int>&pre, vector<int>&in, int pl, int pr, int il, int ir) {
        if (pl > pr) return NULL;
        int k = pos[pre[pl]] - il;
        TreeNode* root = new TreeNode(pre[pl]);
        root->left = dfs(pre, in, pl + 1, pl + k, il, il + k - 1);
        root->right = dfs(pre, in, pl + k + 1, pr, il + k + 1, ir);
        return root;
}