刷题使我快乐,满脸开心.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
}