Leetcode刷题记录

102 阅读2分钟

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;
    }
}```