1813. 句子相似性 III
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
难度中等100
一个句子是由一些单词与它们之间的单个空格组成且句子的开头和结尾没有多余空格。比方说"Hello World"
"HELLO"
"hello world hello world"
都是句子。每个单词都 只 包含大写和小写英文字母。
如果两个句子 sentence1
和 sentence2
可以通过往其中一个句子插入一个任意的句子可以是空句子而得到另一个句子那么我们称这两个句子是 相似的 。比方说sentence1 = "Hello my name is Jane"
且 sentence2 = "Hello Jane"
我们可以往 sentence2
中 "Hello"
和 "Jane"
之间插入 "my name is"
得到 sentence1
。
给你两个句子 sentence1
和 sentence2
如果 sentence1
和 sentence2
是相似的请你返回 true
否则返回 false
。
示例 1
输入sentence1 = "My name is Haley", sentence2 = "My Haley" 输出true 解释可以往 sentence2 中 "My" 和 "Haley" 之间插入 "name is" 得到 sentence1 。
示例 2
输入sentence1 = "of", sentence2 = "A lot of words" 输出false 解释没法往这两个句子中的一个句子只插入一个句子就得到另一个句子。
示例 3
输入sentence1 = "Eating right now", sentence2 = "Eating" 输出true 解释可以往 sentence2 的结尾插入 "right now" 得到 sentence1 。
示例 4
输入sentence1 = "Luky", sentence2 = "Lucccky" 输出false
提示
1 <= sentence1.length, sentence2.length <= 100
sentence1
和sentence2
都只包含大小写英文字母和空格。sentence1
和sentence2
中的单词都只由单个空格隔开。
思路
题目意思是往句子1或者往句子2插入某一个句子使得两个句子一样,我们插入的句子要么是在句子的右面使其两个句子相等(s1 : abc s2 : abc efg) 要么是左面比如(s1 : efg s2 : abc efg),要么是在中间比如(s1:abcd s2:abeeeecd)
对于插在句子左面,插在句子右面都可以合并为将某一个句子插在句子1或者句子2的中间使得两个句子相等(只不过某一边为空而已).
所以可以总结为要使其两个句子相似,必定在句子1或者句子2中间插入某一个句子.
- 计算句子1和句子2左边单词相等的数量
- 计算句子1和句子2右边单词相等的数量
- 如果左边单词数量和右边单词数量之和等于句子1和句子2的最小长度,那就说明[插入某一个句子]到[两个句子中长度最小的那个句子] 一定与 另外一个句子相似
class Solution {
public boolean areSentencesSimilar(String sentence1, String sentence2) {
String[] str1 = sentence1.split(" ");
String[] str2 = sentence2.split(" ");
int i =0,j=0;
//找左边相等的数量
while(i<str1.length&&i<str2.length&&str1[i].equals(str2[i])) {
i++;
}
//找右边相等的数量
while(j<str1.length- i &&j<str2.length-i &&str1[str1.length-1-j].equals(str2[str2.length-1-j])) {
j++;
}
//如果单词的相等数量等于两个句子的最小长度,那就说明使用某一个句子插入到这个最小长度的句子 能够与另外一个句子相似
return i+j==Math.min(str1.length,str2.length);
}
}