刷题使我快乐,满脸开心.jpg
- 来源:力扣(LeetCode)
- 链接:https://leetcode.cn/problems/camelcase-matching
- 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题目
如果我们可以将小写字母插入模式串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
- 所有字符串都仅由大写和小写英文字母组成。
思路
你以为他要跟你玩字符串匹配,其实他是想玩题意理解,这个题并不需要字符串匹配算法,但是需要吃透题目到底是想要干什么。通读下来,无法匹配其实有两个条件
1、因为可以任意插入小写字母,所以不用太过考虑模式串中缺失的小写字母,但是大写字母就不能有缺失了
2、同样因为小写字母可以随意插入,所以只要模式串可以完全包含在查询项中即可
整理下,这两个条件可能不太容易直观转变为代码
1、模式串中的字符需要是查询项的子集,且有序
2、模式串中不可以缺少查询项中已有的大写字母
有了思路那就可以愉快的开始循环嵌套了,两个退出条件
1、模式串中的字符还没有遍历完,查询项已经遍历完了,即模式串中的字符不是查询项的子集
2、模式串中字符与查询项中字符无法匹配时,查询项中的此字符为大写字母
代码
func camelMatch(queries []string, pattern string) []bool {
result := make([]bool, len(queries))
for i := 0; i < len(queries); i++ {
result[i] = true
query := queries[i]
point := 0
for _, char := range query {
if point < len(pattern) && pattern[point] == byte(char) {
point++
} else if unicode.IsUpper(char) {
result[i] = false
break
}
}
if point < len(pattern) {
result[i] = false
}
}
return result
}