LeetCode——1813. 句子相似性 III(Sentence Similarity III)[中等]——分析及代码(Java)

LeetCode——1813. 句子相似性 III[Sentence Similarity III][中等]——分析及代码[Java]

  • 一、题目
  • 二、分析及代码
    • 1. 双指针
      • (1)思路
      • (2)代码
      • (3)结果
  • 三、其他

一、题目

一个句子是由一些单词与它们之间的单个空格组成,且句子的开头和结尾没有多余空格。比方说,“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 中的单词都只由单个空格隔开。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sentence-similarity-iii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、分析及代码

1. 双指针

(1)思路

对 2 个句子分别在首、尾设计双指针,遇到相同的单词时将指针同步向中间移动。若最大程度地移动后,其中一个句子(短句子)的双指针完成了对整个句子的遍历,说明两个句子是相似的。

(2)代码

class Solution {
    public boolean areSentencesSimilar(String sentence1, String sentence2) {
        String[] sen1, sen2;
        //使长度 sen1 >= sen2 
        if (sentence1.length() >= sentence2.length()) {
            sen1 = sentence1.split(" ");
            sen2 = sentence2.split(" ");
        } else {
            sen1 = sentence2.split(" ");
            sen2 = sentence1.split(" ");
        }

        int l1 = 0, r1 = sen1.length - 1;//sen1的左右指针
        int l2 = 0, r2 = sen2.length - 1;//sen2的左右指针
        if ((!sen1[l1].equals(sen2[l2])) && (!sen1[r1].equals(sen2[r2])))//首尾均不相同,一定不相似
            return false;
        while (l2 <= r2 && sen1[l1].equals(sen2[l2])) {//最大程度移动左指针
            l1++;
            l2++;
        }
        while (l2 <= r2 && sen1[r1].equals(sen2[r2])) {//最大程度移动右指针
            r1--;
            r2--;
        }
        return (l2 > r2);//sen2的左右指针重合则相似
    }
}

(3)结果

执行用时 :1 ms,在所有 Java 提交中击败了 100.00% 的用户;
内存消耗 :36.6 MB,在所有 Java 提交中击败了 100.00% 的用户。
(目前提交用户量不足,暂无排名)

三、其他

暂无。

你可能感兴趣的:(数据结构与算法,LeetCode,Java,题解)