leetcode每日一题47

*138. 随机链表的复制
用哈希表记录当前创建的节点的后继节点和指向的节点是否被创建,若未被创建,则递归地创建,拷贝完成后,然后再回溯到当前创建的节点,继续另一个节点(后继节点或指向的节点)的内容

unordered_map的count()用于检查某个元素是否在表里

/*
// Definition for a Node.
class Node {
public:
    int val;
    Node* next;
    Node* random;
    
    Node(int _val) {
        val = _val;
        next = NULL;
        random = NULL;
    }
};
*/

class Solution {
public:
    unordered_map<Node*, Node*> nodeMap;
    Node* copyRandomList(Node* head) {
        
        if(head==nullptr)
            return nullptr;
        if(!nodeMap.count(head))
        {
            Node* head1 = new Node(head->val);
            nodeMap[head] = head1;
            head1->next = copyRandomList(head->next);
            head1->random = copyRandomList(head->random);
        }
        return nodeMap[head];
    }
};

139.单词拆分
动态规划+剪枝
检查一个字符串是否出现在给定的字符串列表里一般可以考虑哈希表来快速判断
dp[i]:以 i 结尾的字符串是否可以被 wordDict 中的单词组合而成
相当于完全背包问题
字符串是背包,wordDict 中的单词是不同重量的物品
外层循环遍历背包容量,即遍历wordDict 中每个单词长度
内层循环遍历wordDict 中的每个单词,看是否匹配
因此定义dp数组为bool类型

 vector<bool> dp(s.size() + 1);

定义边界条件dp[0]=true;
dp[i]=dp[i] || dp[i-word.size()]

class Solution {

public:

    bool wordBreak(string s, vector<string>& wordDict) {

        vector<bool> dp(s.size() + 1);

        dp[0] = true;

        for(int i = 1; i < s.size()+1; i++){

            for(auto& word: wordDict){

                int sz = word.size();        

                if (i - sz >= 0 && s.substr(i - sz, sz) == word)

                    dp[i] = dp[i] || dp[i - sz];            

            }       

        }

        return dp[s.size()];

    }   

};

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值