题目描述
如果我们可以将小写字母插入模式串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".
解题思路
这道题核心是匹配字符串,最开始理解成前缀匹配,最后发现匹配模式:ControlPanel对应CooP这个模式返回结果是true,说明不是前缀匹配。
为了解决这个问题,思路如下:
- 定义方法:boolean isMatch(String word, String pattern);
- 准备2个指针l1和l2,l1用于记录word位置,l2用于记录pattern位置;
- 如果word.charAt(l1) == pattern.charAt(l2),那么l1++,l2++;否则只做l1++;
- 如果word.charAt(l1)出现大写字符,直接返回false。
具体的代码实现:
private boolean isMatch(String word, String pattern) {
int l1 = 0;
int l2 = 0;
while (l1 < word.length() && l2 < pattern.length()) {
if (word.charAt(l1) == pattern.charAt(l2)) {
l1++;
l2++;
} else {
if (Character.isUpperCase(word.charAt(l1))) {
return false;
}
l1++;
}
}
while (l1 < word.length()) {
if (Character.isUpperCase(word.charAt(l1))) {
return false;
}
l1++;
}
return l2 == pattern.length();
}
下面图示说明:
代码实现如下:
import java.util.ArrayList;
import java.util.List;
class Solution {
public List<Boolean> camelMatch(String[] queries, String pattern) {
List<Boolean> res = new ArrayList<>(queries.length);
for (String query : queries) {
res.add(isMatch(query, pattern));
}
return res;
}
private boolean isMatch(String word, String pattern) {
int l1 = 0;
int l2 = 0;
while (l1 < word.length() && l2 < pattern.length()) {
if (word.charAt(l1) == pattern.charAt(l2)) {
l1++;
l2++;
} else {
if (Character.isUpperCase(word.charAt(l1))) {
return false;
}
l1++;
}
}
while (l1 < word.length()) {
if (Character.isUpperCase(word.charAt(l1))) {
return false;
}
l1++;
}
return l2 == pattern.length();
}
public static void main(String[] args) {
Solution solution = new Solution();
System.out.println(solution.camelMatch(new String[]{"FooBar", "FooBarTest", "FootBall", "FrameBuffer", "ForceFeedBack"}, "FB"));
System.out.println(solution.camelMatch(new String[]{"CompetitiveProgramming", "CounterPick", "ControlPanel"}, "CooP"));
}
}
总结
这道题核心就是字符串匹配,匹配时要考虑出现大写字符的case;如果有更加简洁、高效的代码,欢迎回复。