目录

LC 1813. 句子相似性 III (opens new window) (opens new window)

中等

# 问题描述

一个句子是由一些单词与它们之间的单个空格组成,且句子的开头和结尾没有多余空格。比方说,"Hello World""HELLO""hello world hello world" 都是句子。每个单词都 包含大写和小写英文字母。

如果两个句子 sentence1sentence2 ,可以通过往其中一个句子插入一个任意的句子(可以是空句子)而得到另一个句子,那么我们称这两个句子是 相似的 。比方说,sentence1 = "Hello my name is Jane"sentence2 = "Hello Jane" ,我们可以往 sentence2"Hello""Jane" 之间插入 "my name is" 得到 sentence1

给你两个句子 sentence1sentence2 ,如果 sentence1sentence2 是相似的,请你返回 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
  • sentence1sentence2 都只包含大小写英文字母和空格。
  • sentence1sentence2 中的单词都只由单个空格隔开。

# 双指针

根据题意,若两个句子相似,必然是从其中短的句子中插入句子得到长的句子,插入的位置可以是头部、中间和尾部,实际上,都可以统一看成从中间插入,头部和尾部插入只是左侧和右侧没有单词。因此,若能够从中间插入,两个句子必然两端的单词是一致的,因此,可以分别统计两端相同单词的个数(注意不重复统计),得到的数为相对较短的句子的单词数即为相似句子。

/**
 * @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
}
  • 时间复杂度:O(n+m)O(n + m)
  • 空间复杂度:O(n+m)O(n + m)
上次更新: 2023/01/31 19:48:05

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 , 转载请注明出处!