每日一解 模式匹配

题目 模式匹配

你有两个字符串,即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;
	}
};

猜你喜欢

转载自blog.csdn.net/new_DYX/article/details/106895116
今日推荐