844.比较含退格的字符串
这是一道简单题,使用的是双指针法,这几天一直在练习双指针的题目,还做了26和283,但是我觉得这两道题比较简单,用双指针法的话并不难理解,所以选择记录下844这道题,虽然解出来了,但是空间占用还是比较高,希望有能帮忙优化的大佬。题目如下:
给定
s和t两个字符串,当它们分别被输入到空白的文本编辑器后,如果两者相等,返回true。#代表退格字符。
输入输出样例如下:
输入: s = "ab#c", t = "ad#c"
输出: true
解释: s 和 t 都会变成 "ac"。
输入: s = "ab##", t = "c#d#"
输出: true
解释: s 和 t 都会变成 ""。
输入: s = "a#c", t = "b"
输出: false
解释: s 会变成 "c",但 t 仍然是 "b"。
对于这个样例,我们可以看出来,这个#不只是只有一个,可能含有多个,并且可能会出现多个#在同一字符串的情况,在这样的情况下,需要把边界条件控制好。然后双指针法的简单理解就是用一个for可以做两个for的功能,也就是说可以在时间为O(n)的情况下完成时间为O(n^2)的功能,慢指针用来寻找发生改变的位置,快指针来产生条件。
在这道题中,慢指针在最开始的时候指向字符数组的第一个位置,然后向后遍历,将后面的值一次传入字符数组中,当快指针发现有字符为#时,则对慢指针录入的字符进行减一操作(退格操作),在遍历完成后,将字符数组转换成字符串(new String()),再使用substring()方法取0到slowpoint的字符串的值。大概思路就是这样,我写了一个函数,然后将两个字符串分别传入函数,获得值以后再进行比较,代码如下:
public boolean backspaceCompare(String s, String t) {
String str1 = tuige(s);
String str2 = tuige(t);
return str1.equals(str2) ? true : false;
}
public String tuige(String s){
int slowpoint=0;
char[] chars=s.toCharArray();
for(int fastpoint=0;fastpoint<chars.length;fastpoint++){
if(chars[fastpoint]=='#'){
slowpoint = slowpoint == 0 ? 0 : slowpoint-1;
}else{
chars[slowpoint++]=chars[fastpoint];
}
}
String str=new String(chars).substring(0,slowpoint);
return str;
}
}```