844. 比较含退格的字符串

题目

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

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

方法一:

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。

posted @   hisun9  阅读(5)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示