[LeetCode] 734. Sentence Similarity 句子相似度
Given two sentences words1, words2 (each represented as an array of strings), and a list of similar word pairs pairs, determine if two sentences are similar.
For example, "great acting skills" and "fine drama talent" are similar, if the similar word pairs are pairs = [["great", "fine"], ["acting","drama"], ["skills","talent"]].
Note that the similarity relation is not transitive. For example, if "great" and "fine" are similar, and "fine" and "good" are similar, "great" and "good" are not necessarily similar.
However, similarity is symmetric. For example, "great" and "fine" being similar is the same as "fine" and "great" being similar.
Also, a word is always similar with itself. For example, the sentences words1 = ["great"], words2 = ["great"], pairs = [] are similar, even though there are no specified similar word pairs.
Finally, sentences can only be similar if they have the same number of words. So a sentence like words1 = ["great"] can never be similar to words2 = ["doubleplus","good"].
Note:
The length of words1 and words2 will not exceed 1000.
The length of pairs will not exceed 2000.
The length of each pairs[i] will be 2.
The length of each words[i] and pairs[i][j] will be in the range [1, 20].
给定两个句子,以单词数组的形式给出words1和words2,以及一组相似单词对pairs,判断两个句子是否相似。两个句子的单词数量要一样,而且words1与words2中的单词是两两相似。单词对的相似具有互逆性但是没有传递性。
解法:哈希表HashMap。先对pairs里面的相似单词进行统计,记得两个单词都最为key添加一次。然后在同时循环两个单词数组单词1和单词2,如果单词相同或者在哈希表里有单词1并且值是单词2,就是相似,直到循环结束返回True。否则返还False。
Java:
public boolean areSentencesSimilar(String[] words1, String[] words2, String[][] pairs) {
if (words1.length != words2.length) return false;
Map<String, Set<String>> similar_words = new HashMap<>(); for (String[] pair : pairs) {
if (!similar_words.containsKey(pair[0]))
similar_words.put(pair[0], new HashSet<>()); if (!similar_words.containsKey(pair[1]))
similar_words.put(pair[1], new HashSet<>()); similar_words.get(pair[0]).add(pair[1]);
similar_words.get(pair[1]).add(pair[0]);
} for (int i = 0; i < words1.length; ++i) {
if (words1[i].equals(words2[i])) continue;
if (!similar_words.containsKey(words1[i])) return false;
if (!similar_words.get(words1[i]).contains(words2[i])) return false;
} return true;
}
Java:
public boolean areSentencesSimilar(String[] words1, String[] words2, String[][] pairs) {
if (words1.length != words2.length) return false;
Map<String, Set<String>> map = new HashMap<>();
for (String[] pair : pairs) {
if (!map.containsKey(pair[0])) {
map.put(pair[0], new HashSet<>());
}
if (!map.containsKey(pair[1])) {
map.put(pair[1], new HashSet<>());
}
map.get(pair[0]).add(pair[1]);
map.get(pair[1]).add(pair[0]);
} for (int i = 0; i < words1.length; i++) {
if (!words1[i].equals(words2[i]) && (!map.containsKey(words1[i]) || !map.get(words1[i]).contains(words2[i]))) {
return false;
}
// if (words1[i].equals(words2[i])) continue;
// if (map.containsKey(words1[i]) && map.get(words1[i]).contains(words2[i])) continue;
// return false;
} return true;
}
Python:
class Solution(object):
def areSentencesSimilar(self, words1, words2, pairs):
"""
:type words1: List[str]
:type words2: List[str]
:type pairs: List[List[str]]
:rtype: bool
"""
if len(words1) != len(words2): return False
similars = collections.defaultdict(set)
for w1, w2 in pairs:
similars[w1].add(w2)
similars[w2].add(w1)
for w1, w2 in zip(words1, words2):
if w1 != w2 and w2 not in similars[w1]:
return False
return True
C++:
class Solution {
public:
bool areSentencesSimilar(vector<string>& words1, vector<string>& words2, vector<pair<string, string>> pairs) {
if (words1.size() != words2.size()) return false; unordered_map<string, unordered_set<string>> similar_words;
for (const auto& pair : pairs) {
similar_words[pair.first].insert(pair.second);
similar_words[pair.second].insert(pair.first);
} for (int i = 0; i < words1.size(); ++i) {
if (words1[i] == words2[i]) continue;
if (!similar_words[words1[i]].count(words2[i])) return false;
} return true;
}
};
C++:
class Solution {
public:
bool areSentencesSimilar(vector<string>& words1, vector<string>& words2, vector<pair<string, string>> pairs) {
if (words1.size() != words2.size()) return false;
unordered_map<string, unordered_set<string>> m;
for (auto pair : pairs) {
m[pair.first].insert(pair.second);
}
for (int i = 0; i < words1.size(); ++i) {
if (words1[i] == words2[i]) continue;
if (!m[words1[i]].count(words2[i]) && !m[words2[i]].count(words1[i])) return false;
}
return true;
}
};
类似题目:
[LeetCode] 737. Sentence Similarity II 句子相似度 II
All LeetCode Questions List 题目汇总
[LeetCode] 734. Sentence Similarity 句子相似度的更多相关文章
- LeetCode 734. Sentence Similarity
原题链接在这里:https://leetcode.com/problems/sentence-similarity/ 题目: Given two sentences words1, words2 (e ...
- [LeetCode] Sentence Similarity 句子相似度
Given two sentences words1, words2 (each represented as an array of strings), and a list of similar ...
- [LeetCode] 737. Sentence Similarity II 句子相似度 II
Given two sentences words1, words2 (each represented as an array of strings), and a list of similar ...
- [LeetCode] 737. Sentence Similarity II 句子相似度之二
Given two sentences words1, words2 (each represented as an array of strings), and a list of similar ...
- 734. Sentence Similarity 有字典数组的相似句子
[抄题]: Given two sentences words1, words2 (each represented as an array of strings), and a list of si ...
- 【LeetCode】734. Sentence Similarity 解题报告(C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 只修改区间起终点 日期 题目地址:https://le ...
- LeetCode 737. Sentence Similarity II
原题链接在这里:https://leetcode.com/problems/sentence-similarity-ii/ 题目: Given two sentences words1, words2 ...
- [LeetCode] Sentence Similarity II 句子相似度之二
Given two sentences words1, words2 (each represented as an array of strings), and a list of similar ...
- 论文阅读笔记: Multi-Perspective Sentence Similarity Modeling with Convolution Neural Networks
论文概况 Multi-Perspective Sentence Similarity Modeling with Convolution Neural Networks是处理比较两个句子相似度的问题, ...
随机推荐
- Zipkin 知识点
在Spring Cloud D版本,zipkin-server通过引入依赖的方式构建工程,自从E版本之后,这一方式改变了,采用官方的jar形式启动. 出处:https://juejin.im/post ...
- java中使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?
java中使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变? 是引用对象的地址值不能变,引用变量所指向的对象的内容是可以改变. final变量永远指向这个对象,是一个常量指针,而 ...
- 阿里巴巴Java开发手册(格式规约篇)——查自己的漏-补自己的缺
(三) 格式规约 1. [强制]大括号的使用约定.如果是大括号内为空,则简洁地写成{}即可,不需要换行:如果是非空代码块则: 1) 左大括号前不换行.行. 2) 左大括号后换行. 3) 右大括号前换行 ...
- wraps装饰器的作用
装饰器的本质是一个闭包函数,作用在于不改变原函数功能和调用方法的基础上给它添加额外的功能.装饰器在装饰一个函数时,原函数就成了一个新的函数,也就是说其属性会发生变化,所以为了不改变原函数的属性,我们会 ...
- Dart 库预览
容导航 dart:core - numbers, collections, strings, and more dart:async - asynchronous programming dart:m ...
- [译] 揭秘 iOS 布局
翻译自:Demystifying iOS Layout 在你刚开始开发 iOS 应用时,最难避免或者是调试的就是和布局相关的问题.通常这种问题发生的原因就是对于 view 何时真正更新的错误理解.想理 ...
- C++ auto 完成类型自动推导与使用
c++11 允许声明一个变量或对象(object)而不需要指明其类型,只需说明它是auto. 1.如: auto i = 42: //i是整型 double f(); auto d=f(); // ...
- 【数论】[因数个数]P4167樱花
题目描述 求不定方程 \(\frac {1}{x} + \frac{1}{y} = \frac{1}{n!}\)的正整数解的个数 \(n \leq 100^6\) Solution 化简得 \(x * ...
- Vue项目预渲染机制
我们知道SPA有很多优点,不过一个缺点就是对(不是Google的)愚蠢的搜索引擎的SEO不友好,为了照顾这些引擎,目前主要有两个方案:服务端渲染(Server Side Rendering).预渲染( ...
- Pymysql+Pandas+Sqlalchemy数据库更新脚本编写
#导入需要的包,使用pymysql操作数据库 #pandas包很强大,可以直接读取数据表,创建dataframe数据结构,同时可以直接将dataframe导出到数据库 #sqlalchemy创建引擎, ...