开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第31天,点击查看活动详情
一、题目描述:
如果我们可以将小写字母插入模式串 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放进字典树比对:(小写字母非严格比对,大写字母严格比对)
-
query的小写字母匹配失败,继续取下一个
query的小写字母匹配成功,字典树往后移一位
-
query的大写字母匹配失败,返回false
-
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
}