LeetCode面试题 16.18. 模式匹配

题目

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

思路

不会。。看题解重新注释一遍。

class Solution {
    
    
    int aCount;
    int bCount;

    public boolean patternMatching(String pattern, String value) {
    
    
        int patLen = pattern.length();
        int valLen = value.length();
        //1 pattern为""
        if (patLen == 0) {
    
    
            return valLen == 0;
        }
        //记录pattern中a,b的数量
        for (int i = 0; i < patLen; i++) {
    
    
            if (pattern.charAt(i) == 'a') {
    
    
                aCount++;
            } else {
    
    
                bCount++;
            }
        }
        //2 pattern不为""
        //2.1 value为"",判断pattern是否为一种字符组成
        if (valLen == 0) {
    
    
            return aCount == 0 || bCount == 0;
        }
        //2.2.1 value不为"",处理pattern只有一种字符串的情况
        if (aCount == 0) {
    
    
            return helper(value, bCount);
        } else if (bCount == 0) {
    
    
            return helper(value, aCount);
        }
        //2.2.2 value不为"",处理pattern中'a'或'b'可为""的情况
        if (helper(value, aCount)) {
    
    
            return true;
        }
        if (helper(value, bCount)) {
    
    
            return true;
        }
        //2.2.3 value不为"",枚举'a','b'所代表的字符串长度
        //使得aCount*aLen+bCount*bLen=valLen
        for (int aLen = 1; aLen * aCount <= valLen - bCount; aLen++) {
    
    
            //valLen减去所有a代表的字符串,个数不够为bCount的倍数
            if ((valLen - aLen * aCount) % bCount != 0) {
    
    
                continue;
            }
            //通过aLen计算bLen
            int bLen = (valLen - aLen * aCount) / bCount;
            if (check(pattern, value, aLen, bLen)) {
    
    
                return true;
            }
        }
        return false;
    }

    boolean helper(String val, int k) {
    
    
        int len = val.length();
        if (len % k != 0) {
    
    
            return false;
        }
        int perStrLen = len / k;
        for (int i = perStrLen; i < len; i += perStrLen) {
    
    
            if (!val.substring(i, i + perStrLen).equals(val.substring(0, perStrLen))) {
    
    
                return false;
            }
        }
        return true;
    }

    boolean check(String pattern, String value, int aLen, int bLen) {
    
    
        String a = null;
        String b = null;
        for (int i = 0, j = 0; i < pattern.length(); i++) {
    
    
            //j每次移动aLen或bLen的长度
            if (pattern.charAt(i) == 'a') {
    
    
                if (a == null) {
    
    
                    a = value.substring(j, j + aLen);
                } else if (!value.substring(j, j + aLen).equals(a)) {
    
    
                    return false;
                }
                j += aLen;
            } else {
    
    
                if (b == null) {
    
    
                    b = value.substring(j, j + bLen);
                } else if (!value.substring(j, j + bLen).equals(b)){
    
    
                    return false;
                }
                j += bLen;
            }
        }
        return true;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_42007742/article/details/106919742