leetcode: 模式匹配

18 篇文章 0 订阅
14 篇文章 0 订阅

题目

你有两个字符串,即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="",反之也符合规则
提示:
  • 0 <= len(pattern) <= 1000
  • 0 <= len(value) <= 1000
  • 你可以假设pattern只包含字母"a"和"b",value仅包含小写字母。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/pattern-matching-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

以下是我的go实现

func patternMatching(pattern string, value string) bool {
	// ac,bc 表示pattern中a和b出现的次数;al,bl 表示a和b模式对应的字符长度;c,l表示只有一种模式时候的次数和长度
	var ac, al, bc, bl, c, l int
	var as, bs, cs string
	// vl,pl表示value和pattern的长度
	var vl, pl = len(value), len(pattern)
	// 模式为空,则value为空为true,否则false
	if pl == 0 {
		if vl == 0 {
			return true
		}
		return false
	}
	// 遍历统计pattern中ac,bc
	for i := 0; i < pl; i++ {
		if string(pattern[i]) == "a" {
			ac++
		} else {
			bc++
		}
	}
	// 如果value为空,ac和bc都不为空,则返回false
	if vl == 0 {
		if ac != 0 && bc != 0 {
			return false
		}
	}
	// 只有a或b单一模式,value长度除与pattern长度则为每个模式对应的字符长度,则可以推导出模式对应字符,重复c次则为预计的字符串,与实际value比较则可以判断是否匹配
	if ac == 0 || bc == 0 {
		if ac == 0 {
			c = bc
		} else {
			c = ac
		}
		if vl%c != 0 {
			return false
		}
		l = vl / c
		cs = value[:l]
		if strings.Repeat(cs, c) == value {
			return true
		}
		return false
	}
	// 遍历可能的al,从0到vl
	for al = 0; al <= vl; al++ {
		// 计算对应的bl
		if (vl-ac*al)%bc == 0 {
			bl = (vl - ac*al) / bc
			if bl<0{
				continue
			}
		} else {
			continue
		}
		// 通过a和b的index,加上al和bl,可以推导出a和b对应的字符串as,bs
		var ai, bi int
		ai = strings.Index(pattern, "a")
		bi = strings.Index(pattern, "b")
		if ai == 0 {
			as = value[:al]
			bs = value[bi*al : bi*al+bl]
		} else {
			bs = value[:bl]
			as = value[ai*bl : ai*bl+al]
		}
		// 根据as和bs,带入到pattern,拼装出对应的字符串tmp
		var tmp = ""
		for i := 0; i < pl; i++ {
			if string(pattern[i]) == "a" {
				tmp += as
			} else {
				tmp += bs
			}
		}
		// tmp和value是否一致判断
		if tmp == value {
			return true
		}
	}
	return false
}

执行结果:通过
执行用时:0 ms
内存消耗:3.3 MB

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值