leetcode 检查替换后的词是否有效

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

给定有效字符串 "abc"

对于任何有效的字符串 V,我们可以将 V 分成两个部分 X 和 Y,使得 X + YX 与 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. 1 <= S.length <= 20000
  2. S[i] 为 'a''b'、或 'c'

 思路解析:这个题是找abc组合的,abc顺序是不会变化的,即使把abc拆开在与其他abc进行拼接也不会发生变化的。由此我们可以得出 abc是一个组,开头的字母一定是a,所给字符串长度一定是3的倍数才能是true。我们可以使用栈来存放这字母直到字符为c出栈,出栈结果为b和a才不算false。直到运行完,没有出现false。就是true。

思路2,可以根据abc字母的个数来进行判断,在读取字母时,判断每个子字符串中abc分别的数量,当a<b||b<c时,该字符串就不会符合要求,还有就是最后判断a==b==c都要相等。

以下是思路一解法

 1 class Solution {
 2     public boolean isValid(String S) {
 3         Stack<Character> s=new Stack();
 4         if(S.length()%3!=0){
 5             return false;
 6         }
 7         S=S.toLowerCase();
 8         if(S.charAt(0)!='a'){
 9             return false;
10         }
11         for (int i = 0; i < S.length(); i++) {
12            char zf=S.charAt(i);
13            if(zf!='c')
14            s.push(zf);
15            else{
16                if(s.size()<2){
17                    return false;
18                }
19                else{
20                    char b=s.pop();
21                    char a=s.pop();
22                    if(b!='b'||a!='a'){
23                        return false;
24                    }
25                }
26            }
27 
28 
29 
30         }
31         return true;
32 
33     }
34 }

 

posted @ 2019-03-03 14:21  natural_law_hwh  阅读(285)  评论(0编辑  收藏  举报