【数组】驼峰式匹配

本文介绍了一种解决字符串匹配问题的方法,关注于驼峰命名规则下的查询。通过实例演示如何判断给定的待查询列表是否与特定模式串‘FB’匹配,同时考虑大写字符的特殊处理。核心思路是定义isMatch函数并应用在实际问题中。
摘要由CSDN通过智能技术生成

题目描述

如果我们可以将小写字母插入模式串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;如果有更加简洁、高效的代码,欢迎回复。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值