LeetCode1003:检查替换后的词是否有效

    xiaoxiao2023-10-27  128

    给定有效字符串 "abc"。

    对于任何有效的字符串 V,我们可以将 V 分成两个部分 X 和 Y,使得 X + Y(X 与 Y 连接)等于 V。(X 或 Y 可以为空。)那么,X + "abc" + Y 也同样是有效的。

    例如,如果 S = "abc",则有效字符串的示例是:"abc","aabcbc","abcabc","abcabcababcc"。无效字符串的示例是:"abccba","ab","cababc","bac"。

    如果给定字符串 S 有效,则返回 true;否则,返回 false。

    示例 1:

    输入:"aabcbc" 输出:true 解释: 从有效字符串 "abc" 开始。 然后我们可以在 "a" 和 "bc" 之间插入另一个 "abc",产生 "a" + "abc" + "bc",即 "aabcbc"。

    示例 2:

    输入:"abcabcababcc" 输出:true 解释: "abcabcabc" 是有效的,它可以视作在原串后连续插入 "abc"。 然后我们可以在最后一个字母之前插入 "abc",产生 "abcabcab" + "abc" + "c",即 "abcabcababcc"。

    示例 3:

    输入:"abccba" 输出:false

    示例 4:

    输入:"cababc" 输出:false

    提示:

    1 <= S.length <= 20000S[i] 为 'a'、'b'、或 'c'

    解析:

       因为最近两天一直在做关于栈的题目,所以拿到题目首先想到的是用栈实现。但是如果在面试中,可能就不会想到,还是自己掌握的不够熟练。这个题目感觉和消消乐差不多,如果有连着的abc,则消除。上边的数据自动往下落,然后继续删除,如果存在异常的情况,如bac,cba这种的,就说明不能完全消除,则返回false。如果字符串的长度小于3,也返回false。

    代码:

    bool isValid(string S) { int size = S.length(); if (size < 3) return false; stack<char>cStack; for (int i = 0; i < size; i++) { if (cStack.empty()) cStack.push(S[i]); else { if(S[i] == 'c') { if (cStack.size() < 2) return false; else//判断是否abc的顺序 { char c = cStack.top(); cStack.pop(); if (c <= cStack.top()) return false; else cStack.pop(); } } else { cStack.push(S[i]); } } } if (cStack.empty()) return true; return false; }

    更优的方法是用vector模拟栈,因为可以访问前边的元素。

    他山之石:

    bool isValid(string S) { vector<char> stack; for (char c : S) { if (c == 'c') { int n = stack.size(); if (n < 2 || stack[n - 1] != 'b' || stack[n - 2] != 'a') return false; stack.pop_back(), stack.pop_back(); } else { stack.push_back(c); } } return stack.size() == 0; }

     

    最新回复(0)