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