面试题 16.18. 模式匹配

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

示例:

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



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



输入: pattern = "aaaa", value = "dogcatcatdog"
输出: false
输入: pattern = "abba", value = "dogdogdogdog"
输出: true
解释: "a"="dogdog",b="",反之也符合规则

提示:

0 <= len(pattern) <= 1000
0 <= len(value) <= 1000
你可以假设pattern只包含字母"a"和"b",value仅包含小写字母。

代码:

思路参考:https://leetcode-cn.com/problems/pattern-matching-lcci/solution/mo-shi-pi-pei-by-leetcode-solution/

func patternMatching(pattern string, value string) bool {
    lenP := len(pattern)
    lenV := len(value)

    if lenP == 0 {
        return lenV == 0
    }

    countA, countB := 0, 0

    for _, v := range pattern {
        if v == 'a' {
            countA++
        }else {
            countB++
        }
    }

    if countB > countA {
        countA, countB = countB, countA
        tmp := ""
        for _, v := range pattern {
            if v == 'a' {
                tmp += "b"
            }else {
                tmp += "a"
            }
        }
        pattern = tmp
    }

    if lenV == 0 {
        return countB == 0
    }

    for lenA := 0; countA * lenA <= lenV; lenA++ {
        countBlenB := lenV - lenA * countA
        if (countB == 0 && countBlenB == 0) || (countB != 0 && countBlenB % countB == 0) {
            lenB := 0
            if countB != 0 {
                lenB = countBlenB / countB
            }
            valueA, valueB := "", ""
            pos := 0 // 指针
            flag := true // 判断是否匹配
            for i := 0; i < lenP; i++ {
                if pattern[i] == 'a' { // pattern中第i个字符是a时
                    sub := value[pos:pos+lenA] // 取当前lenA长度的字符
                    if len(valueA) == 0 {
                        valueA = sub
                    } else if valueA != sub {
                        flag = false
                        break
                    }
                    pos += lenA
                } else { // pattern中第i个字符是b时
                    sub := value[pos:pos+lenB] // 取当前lenB长度的字符
                    if len(valueB) == 0 {
                        valueB = sub
                    } else if valueB != sub {
                        flag = false
                        break
                    }
                    pos += lenB
                }
            }
            if flag && valueA != valueB {
                return true
            }
        }
    }
    return false
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值