844.比较含退格的字符串
给定 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
只含有小写字母以及字符'#'
进阶:
-
你可以用
O(n)
的时间复杂度和O(1)
的空间复杂度解决该问题吗?
思路1 两个相等字符串的逆序也相等
自己的想法是如果两个字符串相等,那么这两个字符串的逆序也一定是相等的,创建一个fastpoint指针指向最后一个,并且创建一个计数器来判断指针指向的字符前面有没有#,如果有#,那么这个字符就被覆盖,我们的count--,直到遍历完我们的字符串,比较两个新生成的字符串
class Solution { public boolean backspaceCompare(String s, String t) { String a = getNewString(s); String b = getNewString(t); return a.equals(b); } public String getNewString(String a) { String ans = ""; int count = 0; int fastpoint = a.length()-1; while(fastpoint>=0) { if(a.charAt(fastpoint)=='#') { count++; }else { if(count!=0) { count--; } else { ans += ""+a.charAt(fastpoint); } } fastpoint--; } return ans; } }
思路2 引入StringBuffer来方便的处理我们的String
在这里,我们利用java的语言特性,引入StringBuffer这个类,来方便的对字符串进行删除与添加
代码如下
class Solution { public boolean backspaceCompare(String s, String t) { return operate(s).equals(operate(t)); } public String operate(String s) { StringBuffer mybuffer = new StringBuffer(); int count = 0; for(;count<s.length();count++) { if(s.charAt(count)!='#') { mybuffer.append(s.charAt(count)); }else { if(mybuffer.length()>0) { mybuffer.deleteCharAt(mybuffer.length()-1); } } } return mybuffer.toString(); } }