题目 模式匹配
你有两个字符串,即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 = “abba”, value = “dogdogdogdog”
输出: true
解释: “a”=“dogdog”,b="",反之也符合规则
提示:
0 <= len(pattern) <= 1000
0 <= len(value) <= 1000
你可以假设pattern只包含字母"a"和"b",value仅包含小写字母。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/pattern-matching-lcci
思路
第一次看这个题目觉得一头雾水,没有明确的思路。但是仔细看一看题目才发现自己漏掉了关键内容,那就是: pattern字符串由字母"a"和"b"组成,也就是说pattern字符串中只有a和b,那么其实可以利用这一点去有效降低时间复杂度。
比如假设pattern中有2个a和3个b,value为dogdogdogdog,那么根据value和pattern的长度,存在三种分配:a代表0个字母和b代表4个字母;a代表3个字母和b代表2个字母;a代表6个字母和b代表0个字母。这样提前确定好字母的数字可以很快检验出必要的答案。
放一下代码的实现:
class Solution {
public:
bool patternMatching(string pattern, string value) {
if (pattern.size() == 0) {
if (value.size() == 0) {
return true;
}
else {
return false;
}
}
if (value.size() == 0) {
if (pattern.find('a') != -1 && pattern.find('b') != -1) {
return false;
}
else {
return true;
}
}
int a_number = 0;
for (int i = 0; i < pattern.size(); i++) {
if (pattern[i] == 'a') {
a_number++;
}
}
int b_number = pattern.size() - a_number;
if (a_number == 0 || b_number == 0) {
if (value.size() % pattern.size() != 0) {
return false;
}
if (a_number == 0) {
return Match(pattern, value, 0, value.size() / pattern.size());
}
else {
return Match(pattern, value, value.size() / pattern.size(), 0);
}
}
for (int i = 0; i * a_number <= value.size(); i++) {
if ((value.size() - a_number * i) % b_number == 0) {
int j = (value.size() - a_number * i) / b_number;
bool answer = Match(pattern, value, i, j);
if (answer) {
return answer;
}
}
}
return false;
}
bool Match(string pattern, string value, int a_length, int b_length) {
int position = 0;
string a, b;
for (int i = 0; a_length > 0 && i < pattern.size(); i++) {
if (pattern[i] == 'a') {
a = value.substr(position, a_length);
break;
}
else {
position += b_length;
}
}
position = 0;
for (int i = 0; b_length > 0 && i < pattern.size(); i++) {
if (pattern[i] == 'b') {
b = value.substr(position, b_length);
break;
}
else {
position += a_length;
}
}
position = 0;
for (int i = 0; i < pattern.size(); i++) {
if (pattern[i] == 'a') {
if (value.substr(position, a_length) != a) {
return false;
}
position += a_length;
}
if (pattern[i] == 'b') {
if (value.substr(position, b_length) != b) {
return false;
}
position += b_length;
}
}
return true;
}
};