• 【数组】驼峰式匹配


    题目描述

    如果我们可以将小写字母插入模式串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。

    具体的代码实现:

    1. private boolean isMatch(String word, String pattern) {
    2. int l1 = 0;
    3. int l2 = 0;
    4. while (l1 < word.length() && l2 < pattern.length()) {
    5. if (word.charAt(l1) == pattern.charAt(l2)) {
    6. l1++;
    7. l2++;
    8. } else {
    9. if (Character.isUpperCase(word.charAt(l1))) {
    10. return false;
    11. }
    12. l1++;
    13. }
    14. }
    15. while (l1 < word.length()) {
    16. if (Character.isUpperCase(word.charAt(l1))) {
    17. return false;
    18. }
    19. l1++;
    20. }
    21. return l2 == pattern.length();
    22. }

    下面图示说明:

    代码实现如下:

    1. import java.util.ArrayList;
    2. import java.util.List;
    3. class Solution {
    4. public List camelMatch(String[] queries, String pattern) {
    5. List res = new ArrayList<>(queries.length);
    6. for (String query : queries) {
    7. res.add(isMatch(query, pattern));
    8. }
    9. return res;
    10. }
    11. private boolean isMatch(String word, String pattern) {
    12. int l1 = 0;
    13. int l2 = 0;
    14. while (l1 < word.length() && l2 < pattern.length()) {
    15. if (word.charAt(l1) == pattern.charAt(l2)) {
    16. l1++;
    17. l2++;
    18. } else {
    19. if (Character.isUpperCase(word.charAt(l1))) {
    20. return false;
    21. }
    22. l1++;
    23. }
    24. }
    25. while (l1 < word.length()) {
    26. if (Character.isUpperCase(word.charAt(l1))) {
    27. return false;
    28. }
    29. l1++;
    30. }
    31. return l2 == pattern.length();
    32. }
    33. public static void main(String[] args) {
    34. Solution solution = new Solution();
    35. System.out.println(solution.camelMatch(new String[]{"FooBar", "FooBarTest", "FootBall", "FrameBuffer", "ForceFeedBack"}, "FB"));
    36. System.out.println(solution.camelMatch(new String[]{"CompetitiveProgramming", "CounterPick", "ControlPanel"}, "CooP"));
    37. }
    38. }

    总结

     这道题核心就是字符串匹配,匹配时要考虑出现大写字符的case;如果有更加简洁、高效的代码,欢迎回复。

     

  • 相关阅读:
    java基于springboot+vue+elementui的校园疫情防控系统 前后端分离
    亚马逊云科技 Community Builder 申请窗口开启
    高等数学(第七版)同济大学 总习题六 个人解答
    springboot校园疫情智慧防控微信小程序 毕业设计-附源码011133
    数字信号处理——CFAR检测器设计(3)
    微信开发者工具C盘占用大的问题
    Android中View的工作流程之measure过程
    第 4 章 串(图书关键字索引表实现)
    linux安装nginx1.9.9
    人脸图像数据增强
  • 原文地址:https://blog.csdn.net/weiliuhong1/article/details/126449014