一个句子是由一些单词与它们之间的单个空格组成,且句子的开头和结尾没有多余空格。比方说,“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 。
https://leetcode.cn/problems/sentence-similarity-iii/description/
/*
* Copyright (c) Huawei Technologies Co., Ltd. 2023-2023. All rights reserved.
*/
package com.huawei.prac;
import java.util.Deque;
import java.util.LinkedList;
import java.util.Objects;
class SolutionNd {
public static void main(String[] args) {
String sentence1 = "My name is a Haley";
String sentence2 = "a Haley";
System.out.println(areSentencesSimilar(sentence2, sentence1));
System.out.println(areSentencesSimilar("a b", "b a"));
}
/**
* 1813. 句子相似性 III[双端队列]
*
* @param sentence1 字符串1
* @param sentence2 字符串2
* @return 是否相似
*/
public static boolean areSentencesSimilar(String sentence1, String sentence2) {
// 匹配一个或多个空格
String[] sens1 = sentence1.split(" +");
String[] sens2 = sentence2.split(" +");
if (sens1.length < sens2.length) {
String[] tmp = sens1;
sens1 = sens2;
sens2 = tmp;
}
Deque<String> queue1 = new LinkedList<>();
for (String str : sens1) {
queue1.offer(str);
}
Deque<String> queue2 = new LinkedList<>();
for (String str : sens2) {
queue2.offer(str);
}
while (!queue2.isEmpty()) {
// 头相同或尾相同则符合条件
if (Objects.equals(queue2.peekFirst(), queue1.peekFirst())) {
queue1.pollFirst();
queue2.pollFirst();
continue;
}
if (Objects.equals(queue2.peekLast(), queue1.peekLast())) {
queue1.pollLast();
queue2.pollLast();
continue;
}
return false;
}
return true;
}
}