LeetCode-in-Java

1023. Camelcase Matching

Medium

Given an array of strings queries and a string pattern, return a boolean array answer where answer[i] is true if queries[i] matches pattern, and false otherwise.

A query word queries[i] matches pattern if you can insert lowercase English letters pattern so that it equals the query. You may insert each character at any position and you may not insert any characters.

Example 1:

Input: queries = [“FooBar”,”FooBarTest”,”FootBall”,”FrameBuffer”,”ForceFeedBack”], pattern = “FB”

Output: [true,false,true,true,false]

Explanation: “FooBar” can be generated like this “F” + “oo” + “B” + “ar”.

“FootBall” can be generated like this “F” + “oot” + “B” + “all”.

“FrameBuffer” can be generated like this “F” + “rame” + “B” + “uffer”.

Example 2:

Input: queries = [“FooBar”,”FooBarTest”,”FootBall”,”FrameBuffer”,”ForceFeedBack”], pattern = “FoBa”

Output: [true,false,true,false,false]

Explanation: “FooBar” can be generated like this “Fo” + “o” + “Ba” + “r”.

“FootBall” can be generated like this “Fo” + “ot” + “Ba” + “ll”.

Example 3:

Input: queries = [“FooBar”,”FooBarTest”,”FootBall”,”FrameBuffer”,”ForceFeedBack”], pattern = “FoBaT”

Output: [false,true,false,false,false]

Explanation: “FooBarTest” can be generated like this “Fo” + “o” + “Ba” + “r” + “T” + “est”.

Constraints:

Solution

import java.util.LinkedList;
import java.util.List;

public class Solution {
    public List<Boolean> camelMatch(String[] queries, String pattern) {
        List<Boolean> ret = new LinkedList<>();
        for (String query : queries) {
            ret.add(check(query, pattern));
        }
        return ret;
    }

    private Boolean check(String query, String pattern) {
        int patternLen = pattern.length();
        int patternPos = 0;
        int uppercaseCount = 0;
        for (int i = 0; i < query.length(); i++) {
            char c = query.charAt(i);
            if (Character.isUpperCase(c)) {
                if (patternPos < patternLen && c != pattern.charAt(patternPos)) {
                    return false;
                }
                uppercaseCount++;
                if (uppercaseCount > patternLen) {
                    return false;
                }
                patternPos++;
            } else {
                if (patternPos < patternLen && c == pattern.charAt(patternPos)) {
                    patternPos++;
                }
            }
        }

        return patternPos == patternLen;
    }
}