• wy的leetcode刷题记录_Day27


    wy的leetcode刷题记录_Day27

    时间:2022-10-29

    1773. 统计匹配检索规则的物品数量

    今天的每日一题是:1773. 统计匹配检索规则的物品数量

    题目介绍

    1. 给你一个数组 items ,其中 items[i] = [typei, colori, namei] ,描述第 i
      件物品的类型、颜色以及名称。

    2. 另给你一条由两个字符串 ruleKey 和 ruleValue 表示的检索规则。

    3. 如果第 i 件物品能满足下述条件之一,则认为该物品与给定的检索规则 匹配 :

      ruleKey == "type" 且 ruleValue == typei 。
      ruleKey == "color" 且 ruleValue == colori 。
      ruleKey == "name" 且 ruleValue == namei 。
      
      • 1
      • 2
      • 3
    4. 统计并返回 匹配检索规则的物品数量 。

    示例 1:
    输入:items =[[“phone”,“blue”,“pixel”],[“computer”,“silver”,“lenovo”],[“phone”,“gold”,“iphone”]],
    ruleKey = “color”,
    ruleValue = “silver”
    输出:1
    解释:只有一件物品匹配检索规则,件物品是[“computer”,"silver ",“lenovo”] 。

    示例 2: 输入:items =
    [[“phone”,“blue”,“pixel”],[“computer”,“silver”,“phone”],[“phone”,“gold”,“iphone”]],
    ruleKey = “type”,
    ruleValue = “phone”
    输出:2
    解释:只有两件物品匹配检索规则,这两件物品分别是
    [“phone”,“blue”,“pixel”] 和 [“phone”,“gold”,“iphone”]。注意,[“computer”,“silver”,“phone”] 未匹配检索规则。

    思路

    一道简单的模拟题,根据题意首先我们通过ruleKey来映射我们要寻找的items的下标也就是(通过哈希映射也可以):unordered_map dictionary = {{"type", 0}, {"color", 1}, {"name", 2}};
    然后通过下标来对比valueKey,最后用一个计数器计数符合要求的item就ok

    代码

    注释掉的是题解里面的答案,思路一致,只不过我用的临时变量加条件判断实现映射(因为本题只要求寻找一个key),而题解使用的是hash映射。

    class Solution {
    public:
        int countMatches(vector<vector<string>>& items, string ruleKey, string ruleValue) {
            int index=0;
            if(ruleKey=="type")
                index=0;
            else if(ruleKey=="color")
                index=1;
            else if(ruleKey=="name")
                index=2;
            
            int ans=0;
            int n=items.size();
            for(int i=0;i<n;i++)
            {
                if(items[i][index]==ruleValue)
                    ans++;
            }
            return ans;
        }
    };
    
    // class Solution {
    // public:
    //     int countMatches(vector>& items, string ruleKey, string ruleValue) {
    //         unordered_map dictionary = {{"type", 0}, {"color", 1}, {"name", 2}};
    //         int res = 0, index = dictionary[ruleKey];
    //         for (auto &&item : items) {
    //             if (item[index] == ruleValue) {
    //                 res++;
    //             }
    //         }
    //         return res;
    //     }
    // };
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    收获

    简单的模拟题,映射+计数就可以完成,比较高级的实现方法时使用哈希表来记录映射,可以解决更多key的查询。

    72. 编辑距离

    题目介绍

    1. 给你两个单词 word1 和 word2, 请返回将 word1 转换成 word2 所使用的最少操作数 。
    2. 你可以对一个单词进行如下三种操作:
      - 插入一个字符
      - 删除一个字符
      - 替换一个字符

    示例 1:
    输入:word1 = “horse”, word2 = “ros”
    输出:3
    解释: horse -> rorse (将 'h’替换为 ‘r’) rorse -> rose (删除 ‘r’) rose -> ros (删除 ‘e’)

    示例 2:
    输入:word1 = “intention”, word2 = “execution”
    输出:5
    解释: intention -> inention (删除 ‘t’) inention -> enention (将 ‘i’ 替换为 ‘e’) enention -> exention (将 ‘n’ 替换为 ‘x’) exention -> exection (将 ‘n’ 替换为 ‘c’) exection -> execution (插入 ‘u’)

    思路

    动态规划写的话条理就很清晰了:

    1. 确定dp数组的含义:dp[i][j] 表示以下标i-1为结尾的字符串word1,和以下标j-1为结尾的字符串word2,最近编辑距离为
      dp[i][j]。
    2. 确定dp数组的递推公式:首先我们遍历俩个字符串的时候每当此时遍历到的俩个字符串子串末尾的字符相等也就是匹配的时候,我们此时应该不需要操作就能实现匹配,所以此时dp[i][j]=dp[i-1][j-1]。而当不相等也就是不匹配的时候,我们需要通过三种操作来让其实现匹配,增删改,而通过观察发现其实我们删除和增加是等效的:打个比方word1减去一个字符d,相当于word2增加一个d去匹配,效果是一样的,所以我们将增加和删除看作是一种操作。所以我们现在只需要考虑删除(增加)、改这两种操作了。对于删的话:
    • 操作⼀:word1删除⼀个元素,那么就是以下标i - 2为结尾的word1 与 j-1为结尾的word2的最近编辑距离 再加上⼀个操作。
    • 操作⼆:word2删除⼀个元素,那么就是以下标i- 1为结尾的word1 与 j-2为结尾的word2的最近编辑距离 再加上⼀个操作。

    对于改的话:

    • 操作三:替换元素, word1 替换 word1[i - 1] ,使其与 word2[j - 1] 相同,此时不⽤增加元素,那么以下标 i-2 为结尾的 word1 与 j-2 为结尾的 word2 的最近编辑距离 加上⼀个替换元素的操作。
    1. 初始化:
    for (int i = 0; i <= word1.size(); i++) dp[i][0] = i;
    for (int j = 0; j <= word2.size(); j++) dp[0][j] = j;
    
    
    • 1
    • 2
    • 3

    代码

    class Solution {
    public:
        int minDistance(string word1, string word2) {
            int n=word1.size();
            int m=word2.size();
            vector<vector<int>> dp(n+1,vector<int>(m+1));
            //init
            if(n==0)
                return m;
            if(m==0)
                return n;
    
            for(int i=0;i<=n;i++)
            {
                dp[i][0]=i;
            }
            for(int i=0;i<=m;i++)
            {
                dp[0][i]=i;
            }
           // dp[0][0]=1;
            for(int i=1;i<=n;i++)
            {
                for(int j=1;j<=m;j++)
                {
                    if(word1[i-1]==word2[j-1])
                    {
                        dp[i][j]=dp[i-1][j-1];
                    }
                    else
                    {
                        dp[i][j]=min({dp[i-1][j],dp[i][j-1],dp[i-1][j-1]})+1;
                    }
                }
            }
    
            return dp[n][m];
            
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    收获

    巩固动态规划知识,之前在做cs61a的题里面有一个一样的修改字符的题,可以使用这种方法去优化一下时间。

  • 相关阅读:
    vue私有过滤器和全局过滤器
    Unity 引入maven https链接的报错问题
    考研高数背诵类知识点-张宇(不定期更新)
    微信小程序云开发
    [Linux] VMware虚拟机开机后直接进入memtest
    07-树(Tree)结构分析
    A类电能质量在线监测装置
    靠“山寨”发家的名创优品,如今是什么模样
    JVM 全面深入
    Postgresql中VACUUM操作原理和应用
  • 原文地址:https://blog.csdn.net/m0_54015435/article/details/127585388