力扣题解:1023. 驼峰式匹配

92 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第31天,点击查看活动详情

一、题目描述:

1023. 驼峰式匹配 - 力扣(LeetCode)

如果我们可以将小写字母插入模式串 pattern 得到待查询项 query,那么待查询项与给定模式串匹配。(我们可以在任何位置插入每个字符,也可以插入 0 个字符。)

给定待查询列表 queries,和模式串 pattern,返回由布尔值组成的答案列表 answer。只有在待查项 queries[i] 与模式串 pattern 匹配时, answer[i] 才为 true,否则为 false

示例 1:

输入:queries = ["FooBar","FooBarTest","FootBall","FrameBuffer","ForceFeedBack"], pattern = "FB"
输出:[true,false,true,true,false]
示例:

"FooBar" 可以这样生成:"F" + "oo" + "B" + "ar""FootBall" 可以这样生成:"F" + "oot" + "B" + "all".
"FrameBuffer" 可以这样生成:"F" + "rame" + "B" + "uffer".

示例 2:

输入:queries = ["FooBar","FooBarTest","FootBall","FrameBuffer","ForceFeedBack"], pattern = "FoBa"
输出:[true,false,true,false,false]
解释:
"FooBar" 可以这样生成:"Fo" + "o" + "Ba" + "r".
"FootBall" 可以这样生成:"Fo" + "ot" + "Ba" + "ll".

示例 3:

输出:queries = ["FooBar","FooBarTest","FootBall","FrameBuffer","ForceFeedBack"], pattern = "FoBaT"
输入:[false,true,false,false,false]
解释: 
"FooBarTest" 可以这样生成:"Fo" + "o" + "Ba" + "r" + "T" + "est".

 

提示:

  • 1 <= queries.length <= 100
  • 1 <= queries[i].length <= 100
  • 1 <= pattern.length <= 100
  • 所有字符串都仅由大写和小写英文字母组成。

二、思路分析:

与其说是树,不如说是链表,但是思路和字典树一致。

给patern建一个字典树

将每一个query放进字典树比对:(小写字母非严格比对,大写字母严格比对)

  1. query的小写字母匹配失败,继续取下一个

    query的小写字母匹配成功,字典树往后移一位

  2. query的大写字母匹配失败,返回false

  3. query的大写字母匹配成功,字典树往后移一位

三、AC 代码:

type Trie struct {
    end bool
    next *Trie
    letter byte
}

func NewTrie() *Trie {
    return &Trie{end:false}
}

func (t *Trie) add (pattern string) {
    cur := t
    for i := range pattern {
        cur.letter = pattern[i]
        cur.next = NewTrie()
        cur = cur.next
    }
    cur.end = true
}

func (t *Trie) search (query string) bool {
    cur := t
    if query == "" {
        return false
    }
    for _, e := range query {
        if e >= 'a' {
            if cur.letter != byte(e) {
                continue
            }
            cur = cur.next
        } else {
            if cur.letter != byte(e) {
                return false
            }
            cur = cur.next
        }
    }
    return cur.end
}

func camelMatch(queries []string, pattern string) []bool {
    res := make([]bool, 0)
    root := NewTrie()
    root.add(pattern)
    for _, query := range queries {
        res = append(res, root.search(query))
    }
    return res
}