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

844. 比较含退格的字符串

时间:2024-11-11 18:42:36浏览次数:1  
标签:844 return string -- else while 字符串 false 退格

题目

说实话自己在尝试这道题的时候没什么清晰的思路和实现方法。

看了官方题解,官方提供了两种方法:

方法一:

img

这个重构字符串刚开始也想到了,但是不知道怎么去实现,看了官方题解后,不禁一颤,噢,这是栈的运用啊,仔细想想,也觉得退格带来的效果真的很像栈顶元素的弹出。

官方代码如下:

class Solution {
public:
    bool backspaceCompare(string S, string T) {
        return build(S) == build(T);
    }

    string build(string str) {
        string ret;
        for (char ch : str) {
            if (ch != '#') {
                ret.push_back(ch);
            } else if (!ret.empty()) {
                ret.pop_back();
            }
        }
        return ret;
    }
};

方法二:

img

官方代码如下:

class Solution {
public:
    bool backspaceCompare(string S, string T) {
        int i = S.length() - 1, j = T.length() - 1;
        int skipS = 0, skipT = 0;

        while (i >= 0 || j >= 0) {
            while (i >= 0) {
                if (S[i] == '#') {
                    skipS++, i--;
                } else if (skipS > 0) {
                    skipS--, i--;
                } else {
                    break;
                }
            }
            while (j >= 0) {
                if (T[j] == '#') {
                    skipT++, j--;
                } else if (skipT > 0) {
                    skipT--, j--;
                } else {
                    break;
                }
            }
            if (i >= 0 && j >= 0) {
                if (S[i] != T[j]) {
                    return false;
                }
            } else {
                if (i >= 0 || j >= 0) {
                    return false;
                }
            }
            i--, j--;
        }
        return true;
    }
};

然后照着官方方法二敲代码的时候又踩了一个坑

我是这样写的

class Solution {
public:
    bool backspaceCompare(string s, string t) {
        int i = s.length() - 1, j = t.length() - 1;
        int skips = 0, skipt = 0;

        while (i >= 0 || j >= 0)
        {
            while (i >= 0)
            {
                if (s[i] == '#')
                    skips++, i--;
                else if(skips > 0)
                    skips--, i--;
                else
                    break;
            }

            while (j >= 0)
            {
                if (t[j] == '#')
                    skipt++, j--;
                else if (skipt > 0)
                    skipt--, j--;
                else 
                    break;
            }

            if (i >= 0 && j >= 0)
                if (s[i] != t[j])
                    return false;
            else
                if (i >= 0 || j >= 0)
                    return false;

            i--, j--;

        }
        return true;
    }
   
};

想着如果if或者else后面的语句只有一句就不用加大括号,简便一点,但是好心办坏事,不能ac,

原因就是if会自动和它最近的else语句自动组成if-else语句,才错了。

附上用方法二分析例子图片

img

img

其中这张图片是若大wile写成while (i >= 0 && j >= 0)的一个不通过的案例,因为一定要两个字符串都走到头没出问题才说明真的没出问题,即要让两个字符串都走完,如果用while (i >= 0 && j >= 0)的话,只要有一方走完了就退出大while了,就直接返回true了,并没有判断是否有一方还有剩余元素。如果大while写出while (i >= 0 || j >= 0)的话,会通过这个大while里面的这段代码:

if (i >= 0 && j >= 0) {
    if (S[i] != T[j]) {
        return false;
    }
} else {
    if (i >= 0 || j >= 0) {
        return false;
    }
}

如果一方走完,一方还没走完(即还有元素剩余的话)就会进入else中的if语句,返回false。

标签:844,return,string,--,else,while,字符串,false,退格
From: https://www.cnblogs.com/hisun9/p/18540327

相关文章

  • apropos——在 whatis 数据库中查找字符串
    转自于:https://github.com/jaywcjlove/linux-command,后不赘述apropos在whatis数据库中查找字符串补充说明apropos命令在一些特定的包含系统命令的简短描述的数据库文件里查找关键字,然后把结果送到标准输出。如果你不知道完成某个特定任务所需要命令的名称,可以使用一个关......
  • Excel.Application使用手册(摘自:https://www.cnblogs.com/codingking/p/6484461.html)
    定制模块行为(1)OptionExplicit'强制对模块内所有变量进行声明  OptionPrivateModule'标记模块为私有,仅对同一工程中其它模块有用,在宏对话框中不显示  OptionCompareText'字符串不区分大小写  OptionBase1'指定数组的第一个下标为1(2)OnErrorResumeNe......
  • 关于我、重生到500年前凭借C语言改变世界科技vlog.17——字符函数&&字符串函数
    文章目录1.字符函数1.1字符分类函数1.1.1islower1.2字符转换函数1.2.1tolower2.字符串函数2.1strlen2.2strcpy和strncpy2.3strcat和strncat2.4strcmp和strncmp2.5strstr2.6strtok2.7strerror希望读者们多多三连支持小编会继续更新你们的鼓励就是我前进的......
  • 代码随想录算法训练营第十天 | 232.用栈实现队列+225. 用队列实现栈+20. 有效的括号+1
    加入训练营有点晚,没跟上任务就开始有些偷懒没有真的认真开始,从第十天开始下决心认真完成每天任务还有博客记录学习过程。栈与队列理论基础首先是学习了栈和队列的理论基础,队列 先进先出,栈 先进后出。栈 以底层容器完成其所有的工作,且对外接口统一,有.push,.pop等,不提供......
  • 字符串(重要)
    //字符串(比赛,公司,必选项)#include<stdio.h>intmain(){   //"abc","123","黑马程序员"   charstr1[5]={'a','b','c','d','\0'};   chararr="abcd3";   charstr2[4]......
  • C++中string字符串的基础操作,学习
    string字符串常用函数substring()string.length()&&string.size()string.find()string.replace()string.substr()string初始化和声明#include<bits/stdc++.h>usingnamespacestd; intmain(){stringstr1;//空字符串stringstr2="hello,w......
  • C语言字符串和十六进制的相互转换方式
    C语言字符串和十六进制的相互转换方式-我就叫宋帅呀-博客园C语言的字符串操作并不像java,Csharp那样提供直接的方法,简单粗暴。所以,在转换的时候往往费力费时,近日做项目正好用到和java程序通讯,java发送过来的数据是十六进制数字组成的字符串,解析的时候颇费心思才算完成,所以......
  • TypeScript基础(一)——交替合并字符串
    TypeScript基础(一)——交替合并字符串题设:输入“abc”、“ef”,输出“aebfc”。1、第一次尝试functionmergeAlternately(word1:string,word2:string):string{//采用三元运算符letmax_len=word1.length<word2.length?word2.length:word1.length;/......
  • 字符串和数据输入
     字符串三种定义方法单引号定义法,可以内含双引号双引号定义法,可以内涵单引号可以使用转移字符(\)来将引号解除效用,变成普通字符串。示例如上字符串的拼接通过+号完成(一般用于字面量和变量或变量和变量之间),只能适用于字符串本身。例如:字符串没有办法通过+和(整数、浮点......
  • Python 深入浅出字符串
    **Python字符串精讲**大家好,我是Giao仔。创作不易请大家多多支持Python的程序中充满了字符串(string),在平常阅读代码时也屡见不鲜。字符串同样是Python中很常见的一种数据类型,比如日志的打印、程序中函数的注释、数据库的访问、变量的基本操作等等,都用到了字符串。......