时间:2022-10-29
今天的每日一题是:1773. 统计匹配检索规则的物品数量
给你一个数组 items ,其中 items[i] = [typei, colori, namei] ,描述第 i
件物品的类型、颜色以及名称。
另给你一条由两个字符串 ruleKey 和 ruleValue 表示的检索规则。
如果第 i 件物品能满足下述条件之一,则认为该物品与给定的检索规则 匹配 :
ruleKey == "type" 且 ruleValue == typei 。
ruleKey == "color" 且 ruleValue == colori 。
ruleKey == "name" 且 ruleValue == namei 。
统计并返回 匹配检索规则的物品数量 。
示例 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
然后通过下标来对比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;
// }
// };
简单的模拟题,映射+计数就可以完成,比较高级的实现方法时使用哈希表来记录映射,可以解决更多key的查询。
示例 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’)
用动态规划写的话条理就很清晰了:
- 操作⼀: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 的最近编辑距离 加上⼀个替换元素的操作。
for (int i = 0; i <= word1.size(); i++) dp[i][0] = i;
for (int j = 0; j <= word2.size(); j++) dp[0][j] = j;
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];
}
};
巩固动态规划知识,之前在做cs61a的题里面有一个一样的修改字符的题,可以使用这种方法去优化一下时间。