力扣844题 比较含退格的字符串。

110 阅读4分钟

题目如下: 给定 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"

 

提示:

  • 1 <= s.length, t.length <= 200
  • s 和 t 只含有小写字母以及字符 '#'

开始思路:看了一下双指针的方法,逆序对比两个字符串,比较每一个需要比较的字母,如果不相同,直接返回false,如果相同,继续进行比较,最后返回true;

image.png

一开始的思路就是对其进行进行遍历,分别判断s和t是不是'#'的不同情况,你会发现这样的代码结构非常差,可能过几天后,自己都不知道这写的是什么。 不仅如此你会发现在不同case的情况下,这个代码是过不了的,也就是说你的代码只能通过一部分测试点。这是为什么呢?

在我写这个if-else结构代码的时候,最直观的感受就是强行对应,怎么说呢,就是看着答案去凑,一开始是去符合case1来写代码,写完之后,case1是通过了,然后case2又不通过了,然后我又去想办法让case2通过,然后又蹦出来一个case3不通过了,我又去凑case3的代码。

这种方式写代码好像只有一件事,就是解决眼前出现的每一个小问题,最后让所有的测试案例通过,但是其实这种方式只能符合现有的测试案例,运气好点的话,测试案例少就过了,但是一旦出现一些特殊的案例就会过不了。这样不仅很麻烦,而且会想非常多的莫名其妙的问题。最重要的一点是,根本没有一点逻辑可言,非常混乱。

如果可以的话,在写这种问题的时候,发现代码中出现了非常多的if-else,而且自己的逻辑也理不清晰了,最好想想有没有什么数据结构能利用的

其他思路:将字符串转换为消除#和相对应的字符后,再来进行比较。

利用堆栈,如果字符不为'#',将其入栈,如果字符为'#',将入栈的字符出栈,这样栈中保留的就是处理好后的字符。

代码如下:

image.png

image.png

可以看到上述代码还可以优化,可以将处理字符串的方式写成一个方法,调用方法来处理就可以,也就不需要定义两个Stack变量和StringBuilder变量。

优化如下:

image.png

可以看见,当相同的操作需要完成两次,就可以用方法来实现,然后调用方法。

另一种思路是使用StringBuilder 变量来作为堆栈使用,相较于上述代码,也算是一种优化。 代码如下:

image.png

利用双指针来实现(答案):

K}_V{IZ)900_S7KOC$W55_N.png

image.png

在看答案之前,通过一步一步解决不同情况出现的问题,最后的思路基本和答案一致,也是通过定义一个计数器,来计数#的个数,并通过它是否为0来判断下一个字符是否需要跳过。但是对于部分测试点出现的问题我并没有很好的解决办法,甚至觉得要解决起来很麻烦,某种程度上来说是代码结构的问题,在某些特别情况的改动上需要修改特别多的部分。但是你可以看见答案中的对于长度不一样这种特殊情况,只需要在最后加上部分代码便可以实现。

很多情况你会发现,你和答案的思路可能是一样的,更多的是答案的结构,以及对于特殊点的处理是我所达不到的,或许读答案的时候会觉得某些地方甚是精妙,原来这样也可以,但是自己偏偏就想不出来。还是得多读多练。