LeetCode1813:句子相似性 III

一个句子是由一些单词与它们之间的单个空格组成,且句子的开头和结尾没有多余空格。比方说,"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. 然后本人就想着怎么省时怎么来,利用String类中现有方法直接判断是否全为前缀或者后缀(乍一看确实没问题),满足则直接return true
3. 否则将字符串分割为单词数组(这也是用java的原因,java的split方法挺简单的),调用helper方法判断是否满足部分前缀且部分后缀

class Solution {
    public boolean areSentencesSimilar(String sentence1, String sentence2) {
        //首先判断长度
        //其次看是否为前缀或者后缀
        //是则直接返回true 否则判断是否单词全为前缀和后缀
        if(sentence1.length()>sentence2.length()){
            if(sentence1.startsWith(sentence2)||sentence1.endsWith(sentence2)) return true;
            return helper(sentence1.split(" "),sentence2.split(" "));
        }else{
            if(sentence2.startsWith(sentence1)||sentence2.endsWith(sentence1)) return true;
            return helper(sentence2.split(" "),sentence1.split(" "));
        }
    }

    //前后缀判断
    //调用这个函数 说明已经不满足全为前缀或者后缀
    //一部分为前缀 一部分为后缀
    public boolean helper(String[] s1,String[] s2){
        int m = s1.length - 1;
        int n = s2.length;
        int i =0, ans = 0;
        int j = n-1;
        while(s2[i].equals(s1[i])){
            i++;
            ans++;
        }
        if(i==0) return false;//因为i==0 说明必须全部为后缀 明显错误
        while(j>=i&&s2[j].equals(s1[m])){
            j--;
            m--;
            ans++;
        }

        return ans==n;
    }
}

当然,这里第二步思路就是错的,可能最开始很多人也会这样子犯错

 这一题其实我属于是画蛇添脚了,直接进行前缀后缀判断即可

		//但是要注意这里判断条件就要改变了 因为这里length为1的话 会越界
		//那为什么上述方法不会呢 因为上述方法进入helper前有判断 如果是前缀 就不会进入
        while(i<n&&s2[i].equals(s1[i])){
            i++;
            ans++;
        }
class Solution {
    public boolean areSentencesSimilar(String sentence1, String sentence2) {
        if(sentence1.length()>sentence2.length()){
            return helper(sentence1.split(" "),sentence2.split(" "));
        }else{
            return helper(sentence2.split(" "),sentence1.split(" "));
        }
    }

    //前后缀判断
    //是否一部分为前缀 一部分为后缀
    public boolean helper(String[] s1,String[] s2){
        int m = s1.length - 1;
        int n = s2.length;
        int i =0, ans = 0;
        int j = n-1;
        //前缀
        while(i<n&&s2[i].equals(s1[i])){
            i++;
            ans++;
        }
        //后缀
        while(j>=i&&s2[j].equals(s1[m])){
            j--;
            m--;
            ans++;
        }
        
        return ans==n;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值