zoukankan      html  css  js  c++  java
  • [LeetCode] 1003. Check If Word Is Valid After Substitutions

    We are given that the string "abc" is valid.

    From any valid string V, we may split V into two pieces X and Y such that X + Y (X concatenated with Y) is equal to V.  (X or Y may be empty.)  Then, X + "abc" + Y is also valid.

    If for example S = "abc", then examples of valid strings are: "abc", "aabcbc", "abcabc", "abcabcababcc".  Examples of invalid strings are: "abccba""ab""cababc""bac".

    Return true if and only if the given string S is valid.

    Example 1:

    Input: "aabcbc"
    Output: true
    Explanation: 
    We start with the valid string "abc".
    Then we can insert another "abc" between "a" and "bc", resulting in "a" + "abc" + "bc" which is "aabcbc".
    

    Example 2:

    Input: "abcabcababcc"
    Output: true
    Explanation: 
    "abcabcabc" is valid after consecutive insertings of "abc".
    Then we can insert "abc" before the last letter, resulting in "abcabcab" + "abc" + "c" which is "abcabcababcc".
    

    Example 3:

    Input: "abccba"
    Output: false
    

    Example 4:

    Input: "cababc"
    Output: false

    Note:

    1. 1 <= S.length <= 20000
    2. S[i] is 'a''b', or 'c'

    Brute force solution, O(n^2), scan through the entire string and remove all "abc" patterns, repeat this process until the string is empty or reaches a stable state that no "abc" can be found.

    class Solution {
        public boolean isValid(String S) {
            String before = S, after = null;
            while(!before.equals("")) {
                after = before.replaceAll("abc", "");
                if(after.length() == before.length()) {
                    return false;
                }
                before = after;
            }
            return true;
        }
    }

    Optimal solution with Stack, O(n) runtime, O(n) space

    Intuition: each time we remove "abc", we need to keep the previously visted characters in the same sequence as before the removal. Each time we see a 'c', we need to check its two closest two predecessors are 'a' and 'b'. This requires LIFO, hence we should use stack.

    class Solution {
        public boolean isValid(String S) {
            Stack<Character> stack = new Stack<>();
            for(char c : S.toCharArray()) {
                if(c == 'c') {
                    if(stack.size() < 2) {
                        return false;
                    }
                    char b = stack.pop();
                    char a = stack.pop();
                    if(a != 'a' || b != 'b') {
                        return false;
                    }
                }
                else {
                    stack.push(c);
                }
            }
            return stack.size() == 0;
        }
    }
  • 相关阅读:
    10、xsl中import用法
    09、xsl中输出对应的列和值
    08、xsl中操作子节点带循环输出
    07、xsl中操作子节点
    06、xsl中choose进行多条件选择
    05、xsl中IF的用法
    04、xsl中对字段进行排序
    03、xsl中添加筛选条件
    02、xsl的for循环输出
    01、xsl样式表用网页输出
  • 原文地址:https://www.cnblogs.com/lz87/p/10468580.html
Copyright © 2011-2022 走看看