1813. 句子相似性 III

该问题涉及字符串处理,要求判断两个句子是否通过在其中一个句子中插入另一个句子变得相同。关键在于计算两边相等的单词数,如果总和等于较短句子的长度,则句子相似。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1813. 句子相似性 III

难度中等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);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值