一个句子是由一些单词与它们之间的单个空格组成,且句子的开头和结尾没有多余空格。比方说,"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/problems/sentence-similarity-iii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

由于只能插入一个句子,所以这个句子要么在开头插入,要么在中间插入,要么在最后插入。

可以想到,从头往后遍历相同的子句,记录长度,再从后往前遍历相同的子句,记录长度。最后将两次的结果相加,如果大于等于最短的句子长度,则必定可以只插入一个句子来达成目的。

一开始没有考虑空格问题,结果挂在了这个例子:"Luky" "Lucccky"

再加一个空格判断就行。

class Solution {
public boolean areSentencesSimilar(String sentence1, String sentence2) {
// 前后加一个空格,就不用判断是否是开头和结尾的问题
sentence1 = ' ' + sentence1 + ' ';
sentence2 = ' ' + sentence2 + ' ';
int minLen = Math.min(sentence1.length(), sentence2.length());
// 计数器,用来保存从前往后数,相同子句的长度
int t1 = 0;
// 用来判断是否是同一个单词,避免某两个单词开头几个字母相同,之后字母不同,或者没有空格的情况。
int j1 = 0;
// 从前往后遍历。
for (int i = 0; i < minLen; i ++) {
if (sentence1.charAt(i) != sentence2.charAt(i)) {
// 避免单词开头几个字母相同,之后不同,或者没有空格的情况。
t1 = t1 - j1;
break;
}
// 判断是否开始一个新的单词
if (sentence1.charAt(i) == ' ') {
j1 = 0;
} else {
// 新单词的长度
j1 ++;
}
t1 ++;
}
// 计数器,用来保存从前往后数,相同子句的长度
int t2 = 0;
// 用来判断是否是同一个单词,避免某两个单词开头几个字母相同,之后字母不同,或者没有空格的情况。
int j2 = 0;
// 从后往前遍历,中间的步骤和从前往后遍历完全相同。
for (int i = 0; i < minLen; i ++) {
char c = sentence1.charAt(sentence1.length() - i - 1);
if (c != sentence2.charAt(sentence2.length() - i - 1)) {
t2 = t2 - j2;
break;
}
if (c == ' ') {
j2 = 0;
} else {
j2 ++;
}
t2 ++;
}
return t1 + t2 >= minLen;
}
}

运行结果:

力扣每日一题2023.1.16---1813. 句子相似性 III的更多相关文章

  1. leetcode 力扣第七题: 整数反转

    哇,发现会写算法的人好牛逼啊,而且好像大多写算法的都不用PHP,哈哈哈哈哈,在领扣里面都没有php这个选项,真尴尬 从几个月之前就想刷题了,但是不会啊,很懵逼啊,昨天搜了一下答案,好像才打开了我这个写 ...

  2. 2022春每日一题:Day 16

    题目:不同子串个数 这题需要利用后缀数组求出的height的性质,我们发现对于每个后缀,他的height后的所有子串就是算在答案里,因此答案只需要求出n-height[i]-sa[i]+1的和就可以了 ...

  3. LeetCode | 力扣周赛C题 5370. 设计地铁系统

    请你实现一个类 UndergroundSystem ,它支持以下 3 种方法: checkIn(int id, string stationName, int t) 编号为 id 的乘客在 t 时刻进 ...

  4. [每日一题2020.06.16] leetcode双周赛T3 5423 找两个和为目标值且不重叠的子数组 DP, 前缀和

    题目链接 给你一个整数数组 arr 和一个整数值 target . 请你在 arr 中找 两个互不重叠的子数组 且它们的和都等于 target .可能会有多种方案,请你返回满足要求的两个子数组长度和的 ...

  5. 【Warrior刷题笔记】力扣169. 多数元素 【排序 || 哈希 || 随机算法 || 摩尔投票法】详细注释 不断优化 极致压榨

    题目 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/majority-element/ 注意,该题在LC中被标注为easy,所以我们更多应该关 ...

  6. 力扣50题 Pow(x,n)

    本题是力扣网第50题. 实现 pow(x, n) ,即计算 x 的 n 次幂函数. 采用递归和非递归思路python实现. class Solution: #递归思路 def myPow_recurs ...

  7. 力扣485. 最大连续1的个数-C语言实现-简单题

    题目 [题目传送门] 给定一个二进制数组, 计算其中最大连续1的个数. 示例 1: 输入: [1,1,0,1,1,1] 输出: 3 解释: 开头的两位和最后的三位都是连续1,所以最大连续1的个数是 3 ...

  8. 力扣1689. 十-二进制数的最少数目-C语言实现-中等难度题

    题目 传送门 如果一个十进制数字不含任何前导零,且每一位上的数字不是 0 就是 1 ,那么该数字就是一个 十-二进制数 .例如,101 和 1100 都是 十-二进制数,而 112 和 3001 不是 ...

  9. 刷题-力扣-剑指 Offer 42. 连续子数组的最大和

    剑指 Offer 42. 连续子数组的最大和 题目链接 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/lian-xu-zi-shu-zu-de ...

  10. 力扣算法题—069x的平方根

    实现 int sqrt(int x) 函数. 计算并返回 x 的平方根,其中 x 是非负整数. 由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去. 示例 1: 输入: 4 输出: 2 示例 ...

随机推荐

  1. JAVA 用分苹果来理解本题

    思路 其实这是一道非常经典的分苹果问题:有m个一样的苹果和n个一样的盘子,把苹果放盘子里,每个盘子允许0-m个苹果,求问有多少种分法? 与本题的共通之点在于,输入的正整数可以看成m个苹果,拆分出的加数 ...

  2. 获取联通光猫PT952G的管理员密码

    前言 普通用户的帐号和密码在光猫的背面 输入光猫网关即可跳转到登录界面 但是没有什么权限操作东西,所以我找到了管理员界面 输入 网关+cu.html 即可跳转到管理员界面 例如我这里是http://1 ...

  3. 打印三位数的水仙花数Java

    public class Flower{ //水仙花数就是一个 个位数的立方+十位数的立方+百位数的立方=这个三位数 //153 = 1*1*1+5*5*5+3*3*3 public static v ...

  4. html网页图片加载失败的友好处理方式

    网络环境总是多样且复杂的,一张网页图片可能会因为网路状况差而加载失败或加载超长时间,也可能因为权限不足或者资源不存在而加载失败,这些都会导致用户体验变差,所以我们需要对图片加载失败时的情况进行一个弥补 ...

  5. JS中BOM与DOM操作

    BOM操作 window对象 是与浏览器窗口做交互的语言 BOM = Browser Object Model 是指浏览器对象模型,它可以使Javascript 有能力和浏览器进行对话 window. ...

  6. view-design tabpane禁用后renderHeader失效问题

    需求是这样的 在tabPane的renderHeader里面添加hover事件(使用组件自带的Poptip)能显示提示 其实这个不算是问题,设置disabled属性后,原本的元素上面添加了 ivu-t ...

  7. web框架推导 wsgiref模块 jinja2模板语法 django框架简介 django基本操作

    目录 纯手撸web框架 web框架的本质 手写web框架 存在的问题 基于wsgiref模块 基本介绍 推导流程 代码封装优化 总结 动静态网页 jinja2模块 前端.后端.数据库三者联动 推导流程 ...

  8. 高可用系列文章之三 - NGINX 高可用实施方案

    前文链接 高可用系列文章之一 - 概述 - 东风微鸣技术博客 (ewhisper.cn) 高可用系列文章之二 - 传统分层架构技术方案 - 东风微鸣技术博客 (ewhisper.cn) 四 NGINX ...

  9. 【QT开发问题】使用自定义的QGroupBox,重写绘图事件paintEvent后边框消失的问题

    问题描述 Qt界面开发过程中,使用自定义的QGroupBox,重写绘图事件paintEvent时,出现边框被覆盖的情况,或边框消失的问题. 左图是原始状态,直接重写绘图事件后,会变成右图空白状态.   ...

  10. 搭建一个Hexo个人博客系统

    0x01 前言 虽然说前两天折腾了一下博客园(自己之前也有做过自己的博客,奈何维护费用太贵了,真的消耗不起,钱要花在刀刃上.) 网上有些教程有些参差不齐,今天给自己的真实搭建过程呈现给大家. 0x02 ...