Site icon Study Algorithms

CamelCase matching

Question: Given a set of queries and a pattern, we need to determine if some of those queries can be made from the given pattern by adding one or more lower case character. Output a boolean array where array[i] says true, if the query is possible, else false.


Input: queries= {“StudyAlgorithms”, “StudyAlgorithmsTest”, “StanAlluring”, “SimulationAlteration”, “StopStayAlive”}
pattern = “StAl”

Output: {true, false, true, true, false}

Let us try to understand the output.
The pattern defined to us is St*Al* (if we see it in terms of a regex)

Other queries cannot be formed as either they do not follow the pattern or they add another upper case letter.

ALGORITHM

– Start for each string in the query array.
– For each string, match it with the pattern and pass the result.

The match process should be defined as:-

– Let ‘i’ be the query pointer.
– Let ‘j’ be the pattern pointer
– If char[i] == char[j], we need to advance both the pointers.
– If char[i] != char[j] and char[i] (query pointer) is a lower case letter, just advance the query pointer. We can keep going as we can add any number of lower case characters.
– If char[i] != char[j] and char[i] (query pointer) is a upper case letter, then return false. This means that we added a new uppercase letter and it would not match the pattern.

The code for the above algorithms can be written as:

public List<Boolean> camelMatch(String[] queries, String pattern) {
    List<Boolean> result = new ArrayList<>();

    char[] patternArr = pattern.toCharArray();

    // Start for each string in the query array
    for (String query : queries) {

        // Match it with the pattern
        boolean isMatch = match(query.toCharArray(), patternArr);

        // Pass the result
        res.add(isMatch);
    }

    return res;
}

private boolean match(char[] queryArr, char[] patternArr) {

    int j = 0; // pattern pointer

    // i is the query pointer
    for (int i = 0; i < queryArr.length; i++) {

        // If char[i] == char[j], we need to advance both the pointers.
        if (j < patternArr.length && queryArr[i] == patternArr[j]) { 
            j++; 
        } else if (queryArr[i] >= 'A' && queryArr[i] <= 'Z') {

            // If the query character is a uppercase letter, then return false.
            return false;
        }
    }

    // Just verify that pattern pointer reaches its length limit
    return j == patternArr.length;
}
Code language: Java (java)

A working solution can be found here. https://ideone.com/Vj89bz

Exit mobile version