【LeetCode 每日一题】1003. 检查替换后的词是否有效

167 阅读1分钟

1003. 检查替换后的词是否有效

难度:中等

时间:2023/05/03


给你一个字符串 s ,请你判断它是否 有效

字符串 s 有效 需要满足:假设开始有一个空字符串 t = "" ,你可以执行 任意次 下述操作将 t 转换为 s

  • 将字符串 "abc" 插入到 t 中的任意位置。形式上,t 变为 tleft + "abc" + tright,其中 t == tleft + tright 。注意,tlefttright 可能为

如果字符串 s 有效,则返回 true;否则,返回 false

示例 1:

 输入:s = "aabcbc"
 输出:true
 解释:
 "" -> "abc" -> "aabcbc"
 因此,"aabcbc" 有效。

示例 2:

 输入:s = "abcabcababcc"
 输出:true
 解释:
 "" -> "abc" -> "abcabc" -> "abcabcabc" -> "abcabcababcc"
 因此,"abcabcababcc" 有效。

示例 3:

 输入:s = "abccba"
 输出:false
 解释:执行操作无法得到 "abccba"

提示:

  • 1 <= s.length <= 2 * 10^4
  • s 由字母 'a''b''c' 组成

解题思路:

根据题意,有效字符串第一个 'c' 必定连接在 "ab" 后方 从头开始遍历字符串 用栈来记录已经出现的 'a' 和 'b' 当遍历到 'b' 时检查栈首是否为 'a' 当遍历到 'c' 时检查栈首是否为 'b' 并出栈 接着再检查栈首是否为 'a' 同时出栈

每个 'a' 后面必须跟着一个 'b' 和一个 'c', 多一个少一个都不行, 同理, 每个 'b' 前面必须跟着一个 'a' 后面跟着一个 'c', 每个 'c' 前面必须跟着一个 'a' 和一个 'b', 既然都是成对出现的, 我们可以用栈来解决此问题

每当遇到 'a' 或者 'b' 时入栈, 每当遇到 'c' 时, 必须先弹出一个 'b' 再弹出一个 'a', 顺序不对或者栈为空的情况返回false

最后, 如果栈为空则返回true 否则返回false

  • 1.考察栈,所以用栈来解此题;
  • 2.针对字母c,当前字母为c时,就pop b and pop a,如果能正常执行,则无误,反之则有错;
  • 3.最后判断栈是否为空即可;
  • 4.完结。
 class Solution {
 public:
     bool isValid(string s) {
         stack<char> stk;
         for (int i = 0; i < s.size(); ++i) {
             if (s[i] == 'a' || s[i] == 'b') {
                 stk.push(s[i]);
             }
             else {
                 if (stk.size() < 2) return false;
                 if (stk.top() != 'b') return false;
                 stk.pop();
                 if (stk.top() != 'a') return false;
                 stk.pop();
             }
         }
 ​
         return stk.size() == 0;
     }
 };
 ​
 ​

解法二:暴力删除

寻找并删除字符串中的"abc",如果找不到"abc",返回字符串s是否为空 如果s为空说明符合要求,如果不为空说明不符合要求

 class Solution {
 public:
     bool isValid(string s) {
         while(s.find("abc")!=string::npos){
         s.erase(s.begin()+s.find("abc"),s.begin()+s.find("abc")+3);}
         return s.empty();
     }
 };
 ​