LeetCode 面试题16.18.模式匹配

模式匹配

题目:

你有两个字符串,即pattern和value。 pattern字符串由字母"a"和"b"组成,用于描述字符串中的模式。例如,字符串"catcatgocatgo"匹配模式"aabab"(其中"cat"是"a","go"是"b"),该字符串也匹配像"a"、"ab"和"b"这样的模式。但需注意"a"和"b"不能同时表示相同的字符串。编写一个方法判断value字符串是否匹配pattern字符串。

  • 0 <= len(pattern) <= 1000
  • 0 <= len(value) <= 1000

来源:力扣(LeetCode)



思路:

预处理:

如果pattern第一个字符不是‘a’,那么我们就把pattern 中 ‘a’,‘b'全部反过来即刻(a=b,b=a)。

我们用两层for循环,外层遍历value,内层遍历pattern。


外层:

用i来遍历,而i的大小就是a的长度,由此计算出b的长度。

注意:a的长度可以为零,而b的长度也可以为零。
n 为 value 的长度。blen为b的长度,bNum为b在pattern中出现的次数,alen与aNum同理。

blen = (n-alen 乘以 aNum)/bNum>=0?(n-alen 乘以 aNum)/bNum:0;

而根据求出来b的长度和a的长度反过来计算value的长度,如果不相等,则跳过本次循环,如果相等,则由pattern得到a和b字符串,进入内层循环。


内层:

根据pattern以及外层得到的a,b字符串,拼出来一个字符串tmp,内层循环结束后与value比较,如果相等,则返回true,否则继续下一次外层循环。


本题思路很好想,就是边界条件和细节是难点。



代码:

class Solution {
    public boolean patternMatching(String pattern, String value) {
        StringBuffer p = new StringBuffer(pattern);
        int m = p.length();
        int n = value.length();
        //边界处理
        if(n == 0){
            if(m == 0){
                return true;
            }
            if(p.indexOf("a")>=0&&p.indexOf("b")>=0){
                return false;
            }
            return true;
        }
        if(n!=0&&m==0){
            return false;
        }
        //开头如果是b,a,b互换
        if(p.charAt(0)=='b'){
            for(int i = 0;i<p.length();i++){
                if(p.charAt(i)=='a'){
                    p.setCharAt(i,'b');
                }else{
                    p.setCharAt(i,'a');
                }
            }
        }
        int aNum = 0;
        int bNum = 0;
        //计算a,b在pattern中出现的次数
        for(int i = 0;i<m;i++){
            if(p.charAt(i)=='a'){
                aNum++;
            }else{
                bNum++;
            }
        }
        //value for循环
        for(int i = 0;i<=n;i++){
            int alen = i;
            StringBuffer a = new StringBuffer(value.substring(0,i));
            int blen = 0;
            if(bNum!=0){
                blen = (n-alen*aNum)/bNum>=0?(n-alen*aNum)/bNum:0;
            }
            if(blen*bNum+alen*aNum != n){
                continue;
            }
            StringBuffer b = new StringBuffer();
            int idx = p.indexOf("b");
            if(idx>=0){
                b = new StringBuffer(value.substring(idx*alen,idx*alen+blen)); 
            }
            StringBuffer tmp = new StringBuffer();
            //pattern for循环
            for(int j = 0;j<m;j++){
                if(p.charAt(j)=='a'){
                    tmp.append(a);
                }else{
                    tmp.append(b);
                }
            }
            //拼凑出了来的tmp对比原字符串value
            if(tmp.toString().equals(value)){
                return true;
            }
        }
        return false;
    }
}
posted @ 2020-06-22 11:21  jackandtwo  阅读(311)  评论(0)    收藏  举报