首页 > 其他分享 >9--844. 比较含退格的字符串

9--844. 比较含退格的字符串

时间:2023-11-15 18:57:21浏览次数:47  
标签:844 return charAt -- else skipS false 退格

给定 s 和 t 两个字符串,当它们分别被输入到空白的文本编辑器后,如果两者相等,返回 true 。# 代表退格字符。

注意:如果对空文本输入退格字符,文本继续为空。

 

示例 1:

输入:s = "ab#c", t = "ad#c"
输出:true
解释:s 和 t 都会变成 "ac"。

示例 2:

输入:s = "ab##", t = "c#d#"
输出:true
解释:s 和 t 都会变成 ""。

示例 3:

输入:s = "a#c", t = "b"
输出:false
解释:s 会变成 "c",但 t 仍然是 "b"。

【看完题解之后我的疑惑:也没有把字符串删除啊】
【然后反应过来,s和t的比较是同步进行的,并不用移除,同一下标下的字符相等即可】
【本题的解法是在记录偏移量】
【为什么选择从后往前遍历呢?因为 # 号只会消除左边的一个字符,所以对右边的字符无影响,所以我们选择从后往前遍历s、t字符串】
class Solution {
    public boolean backspaceCompare(String s, String t) {
        int i = s.length() - 1;
        int j = t.length() - 1;
        int skipS = 0, skipT = 0;

        while (i >= 0 || j >= 0) {

            // s循环
            // i 从最后一个元素开始,如果此指针指向的元素为“#“,那么skipS的值加一,再接着判断skipS的值是否大于0;
            //如果大于零,则要消灭”#“,那么就skipS--,并且i--;通过循环回退同等数量的字符
            while (i >= 0) {
                if (s.charAt(i) == '#'){
                    skipS++;
                    i--; //此i--是从'#'字符指向下一个
                } else if (skipS > 0) {
                    skipS--;
                    i--; //此i--是因为skipS > 0 ;执行回退操作
                }else {
                    break;  //当此位置上的字符不是” # ”且skipS为0(即并没有扫描到#还),直接跳出此循环
                }
            }

            //T循环
            while (j >= 0) {
                if (t.charAt(j) == '#') {
                    skipT++;
                    j--;
                }else if (skipT > 0){
                    skipT--;
                    j--;                
                }else {
                    break;
                }

                      
            }
            // if (i >= 0 && j >= 0){
            //     if (s.charAt(i) == t.charAt(j)){
            //         return true;
            //     } 
            // } else {
            //         return false;
            //     }

            //为什么这个逻辑就是对的,换成相等的就是不对啊
            if (i >= 0 && j >= 0) {
                if (s.charAt(i) != t.charAt(j)){
                    return false;
                }
            } else {
                if (i>= 0 || j>= 0) {
                    return false;
                }
            }
            i--;
            j--;
        } 
        return true;  
    
    }
}
   

 【再问(改进版)】

 if (i >= 0 && j >= 0){
                if (s.charAt(i) != t.charAt(j)){
                    return false;
                }
                //?? 加上下面这些逻辑不是一样的吗  为什么加上了就是不对啊
                // } else {
                //     return true;
                // }
            } else {
                if (i>= 0 || j>= 0) {
                    return false;
                }
            }

            //为什么这个逻辑就是对的,换成相等的就是不对啊
            // if (i >= 0 && j >= 0) {
            //     if (s.charAt(i) != t.charAt(j)){
            //         return false;
            //     }
            // } else {
            //     if (i>= 0 || j>= 0) {
            //         return false;
            //     }
            // }

 

标签:844,return,charAt,--,else,skipS,false,退格
From: https://www.cnblogs.com/18191xq/p/17832039.html

相关文章

  • 题解 P7405 [JOI 2021 Final] 雪玉
    洛谷。题意应该好理解的。分析我们的所有雪球在同一时间之间的距离都是相同的,因此一段雪,要么是它左侧的第一个所取,要么右侧第一个所取,要么不被取,并且,我们每一个雪球所占有的雪是连续的一段。我们令\(L_i\)表示第\(i\)步前所能走的最左点,\(R_i\)表示第\(i\)步前所能走......
  • Q7.4.1.3. 产品销售 题解
    原题链接连\(S\toA_i\),流量\(D_i\),费用\(P_i\),表示最多进货\(D_i\),成本为\(P_i\)。连\(A_i\toT\),流量\(U_i\),费用\(0\),表示卖出。连\(A_i\toA_{i+1}\),流量\(+\infty\),费用\(C_i\),表示把\(A_i\)的货物拖一天花费\(C_i\)。连\(A_{i+1}\toA_i\),流量\(+\inft......
  • [题解]AT_abc267_f [ABC267F] Exactly K Steps
    大家好,我是毒瘤,喜欢用玄学算法过题。发现题解区没有这个做法,于是来发一篇。思路不难发现如果一个点对\((u,v)\)的距离为\(d\),那么在这棵树以\(u\)为根时,\(v\)的深度为\(d\)。于是考虑换根DP。首先思考如何计算答案。显然我们可以将查询离线下来,然后当换根到以\(u\)......
  • 题解 「2019五校联考-镇海1」一棵树
    题意一棵\(n\)个结点的树,根节点为\(1\),结点\(i\)的父亲是\(f_i\)。\(f_1=f_0=0\)。对于每一个整数\(i\),假如\(f_{f_i}\)不为\(0\),那么就将\(f_{f_i}\)与\(i\)连上一条边。从每一个结点,每次随机向相邻的结点走。问每个结点期望走多少步才能走到根。对于\(60\%\),\(......
  • [Unity3D]检测鼠标点击角色移动
    学习工具Unity3D学习内容如何检测鼠标点击移动角色自己的理解原理:通过检测鼠标的光线投射(Raycast)是否与地面碰撞(RaycastHit),再检测鼠标左键(Input.GetMouseButton(0))是否点击,如果两个都符合则执行移动方法源代码如下:privateboolInteractWithMovement(){Raycas......
  • FPGA入门学习笔记001
    1、assignassign为连续赋值语句,通常用于组合逻辑电路,例如:assignled_out=(key_in==0)?a:b;2、timescale例如:`timescale1ns/1ps定义了一个仿真精度。'1ns'为仿真步进,例如设置100的延时'#100',则实际延时100*1ns。'1ps'为仿真精度,设定延时,可以精确到小数点后两位,例......
  • 免费IDEA插件分享:Apipost-Helper
    今天给大家推荐一款IDEA插件:Apipost-Helper-2.0,写完代码IDEA内一键生成API文档,无需安装、打开任何其他软件;写完代码IDEA内一键调试,无需安装、打开任何其他软件;生成API目录树,双击即可快速定位API定义的代码…非常好用!而且完全免费!在IDEA编辑器插件中心输入Apipost搜索安装:Apipost......
  • 狂神Markdown基础操作学习记录
    Markdown学习标题一级标题:#+空格+标题二级标题:##+空格+标题三级标题:###+空格+标题四级标题:####+空格+标题以此类推(最多到六级标题)字体Hello,World!两边加上**:加粗Hello,World!两边一个*:斜体Hello,World!两边三个***:斜体加粗Hello,World!删除线:两边波浪号(注意英文输入法)......
  • 肝炎的症状有哪些
    肝炎是一种肝脏疾病,通常由病毒感染引起。症状可以因病毒的类型和感染的程度而有所不同。以下是肝炎的常见症状:1.疲劳:肝炎患者通常感到疲倦,缺乏精力。2.黄疸:肝炎患者可能会出现黄疸,皮肤和眼白变黄,尿液颜色变深。3.恶心和呕吐:患者可能会感到恶心和呕吐,这是因为肝脏不......
  • luoguP3287 [SCOI2014] 方伯伯的玉米田
    题目描述方伯伯在自己的农田边散步,他突然发现田里的一排玉米非常的不美。这排玉米一共有NN株,它们的高度参差不齐。方伯伯认为单调不下降序列很美,所以他决定先把一些玉米拔高,再把破坏美感的玉米拔除掉,使得剩下的玉米的高度构成一个单调不下降序列。方伯伯可以选择一个区间,把这......