简单模式匹配(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
}