LC 1813. 句子相似性 III (opens new window) (opens new window)
中等
# 问题描述
一个句子是由一些单词与它们之间的单个空格组成,且句子的开头和结尾没有多余空格。比方说,"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
中的单词都只由单个空格隔开。
# 双指针
根据题意,若两个句子相似,必然是从其中短的句子中插入句子得到长的句子,插入的位置可以是头部、中间和尾部,实际上,都可以统一看成从中间插入,头部和尾部插入只是左侧和右侧没有单词。因此,若能够从中间插入,两个句子必然两端的单词是一致的,因此,可以分别统计两端相同单词的个数(注意不重复统计),得到的数为相对较短的句子的单词数即为相似句子。
/**
* @param {string} sentence1
* @param {string} sentence2
* @return {boolean}
*/
var areSentencesSimilar = function (sentence1, sentence2) {
if (sentence1.length > sentence2.length) return areSentencesSimilar(sentence2, sentence1)
const words1 = sentence1.split(' ')
const words2 = sentence2.split(' ')
let i = 0
let j = 0
while (i < words1.length && words1[i] === words2[i]) {
i++
}
words1.reverse()
words2.reverse()
while (j < words1.length - i && words1[j] === words2[j]) {
j++
}
return i + j === words1.length
}
- 时间复杂度:
- 空间复杂度:
上次更新: 2023/01/31 19:48:05
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 , 转载请注明出处!