745. Prefix and Suffix Search

Description

Design a special dictionary which has some words and allows you to search the words in it by a prefix and a suffix.

Implement the WordFilter class:

  • WordFilter(string[] words) Initializes the object with the words in the dictionary.

  • f(string prefix, string suffix) Returns the index of the word in the dictionary which has the prefix prefix and the suffix suffix. If there is more than one valid index, return the largest of them. If there is no such word in the dictionary, return -1.

Constraints

  • 1 <= words.length <= 15000

  • 1 <= words[i].length <= 10

  • 1 <= prefix.length, suffix.length <= 10

  • words[i], prefix and suffix consist of lower-case English letters only.

  • At most 15000 calls will be made to the function f.

Approach

  • GeeksforGeeks

  • ProgramCreek

  • YouTube

Examples

Input:

["WordFilter", "f"]

[[["apple"]], ["a", "e"]]

Output:

[null, 0]

Explanation:

WordFilter wordFilter = new WordFilter(["apple"]);

wordFilter.f("a", "e"); // return 0, because the word at index 0 has prefix = "a" and suffix = 'e".

Solutions

/**
 * Time complexity : 
 * Space complexity : 
 */

class WordFilter {
    
    private Map<String, Integer> map;

    public WordFilter(String[] words) {
        map = new HashMap();
        
        for(int i = 0; i < words.length; i++) {
            String word = words[i];
            
            List<String> prefix = new ArrayList();
            List<String> suffix = new ArrayList();
            
            for(int j = 0; j <= word.length(); j++) {
                prefix.add(word.substring(0, j));
                suffix.add(word.substring(j));
            }
            
            for(String p: prefix) {
                for(String s: suffix) {
                    String key = p + "#" + s;
                    map.put(key, Math.max(map.getOrDefault(key, 0), i));
                }
            }
        }
    }
    
    public int f(String prefix, String suffix) {
        String word = prefix + "#" + suffix;
        return map.getOrDefault(word, -1);
    }
}

/**
 * Your WordFilter object will be instantiated and called as such:
 * WordFilter obj = new WordFilter(words);
 * int param_1 = obj.f(prefix,suffix);
 */

Follow up

Last updated

Was this helpful?