简单模式匹配(c++实现)

简单模式匹配(c++实现)

这是leetcode上的一道题:

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

示例 1:

输入: pattern = "abba", value = "dogcatcatdog"
输出: true

示例 2:

输入: pattern = "abba", value = "dogcatcatfish"
输出: false

示例 3:

输入: pattern = "aaaa", value = "dogcatcatdog"
输出: false

示例 4:

输入: pattern = "abba", value = "dogdogdogdog"
输出: true
解释: "a"="dogdog",b="",反之也符合规则
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/pattern-matching-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路:

1.获取a, b的个数,以及a的最大长度,比如上面的示例4:
	a的个数是2, b的个数是2,a的最大长度max=value的长度/a的个数 = 12/2=6
2.两层循环,第一层循环 a的长度(0~max),根据a,b的个数,a的长度,以及value的长度求出
	b的长度,这个长度是整数,如果验证长度不等则跳过,相等进入第二层循环;
3求出b的长度后,循环遍历pattern ,通过长度接取value 与a,b比较,全部相同则返回true,
	否则跳出第二层循环。
4.最后都没有匹配成功,则返回false

代码如下:

	bool patternMatching(string pattern, string value)
    {
    
    
        int acount = 0, bcount = 0;
        for (auto a : pattern) {
    
    
            if (a == pattern[0])
                acount += 1;
            else
                bcount += 1;
        }
        if (value == "" && bcount > 0) {
    
    	// 如题a,b不相等,且a一定不为空,所以返回false
            return false;
        }
        int vlen = value.size();
        int alen = vlen / acount, blen;
        string astr, bstr;
        bool bflag = false;
        int i = bcount == 0 ? alen : 0;
        for (; i <= alen; i++) {
    
    
            blen = bcount == 0 ? 0 :(vlen - i * acount) / bcount;		//求出b的长度
            if (blen * bcount + acount * i == vlen) {
    
    	//验证长度,相等则进入第二层循环
                astr = value.substr(0, i);
                bflag = false;
                bool flag = true;
                int off = i;
                for (int k = 1; k < pattern.size(); k++) {
    
    	//遍历pattern
                    if (pattern[0] == pattern[k]) {
    
    
                        if (astr != value.substr(off, i)) {
    
    	//截取value与a比较
                            flag = false;
                            break;
                        }
                        off += i;
                    }
                    else{
    
    
                        if (!bflag) {
    
    	//因长度不定,一开始不能知道b,需加个标记获取
                            bflag = true;
                            bstr = value.substr(off, blen);
                        }
                        else {
    
    
                            if (bstr != value.substr(off, blen)) {
    
    	//截取value与b比较
                                flag = false;
                                break;
                            }
                        }
                        off += blen;
                    }
                }
                if (flag)	//满足条件,返回
                    return true;
            }
        }
        return false;	//没有匹配成功,返回false
    }

猜你喜欢

转载自blog.csdn.net/h799710/article/details/107153140