Skip to main content
Back to problems
#745
Hard Algorithms

Prefix and suffix search

Array Hash Table String Design Trie
40.8% acceptance
Feb 21, 2026
2346
499
Design a special dictionary that searches 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 pref, string suff) Returns the index of the word in the dictionary, which has the prefix pref and the suffix suff. If there is more than one valid index, return the largest of them. If there is no such word in the dictionary, return -1.

Solution

Rust
Time O(n³)
Space O(n)
LeetCode
solution.rs
/*
 * Design a special dictionary that searches 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 pref, string suff) Returns the index of the word in the dictionary, which has the prefix pref and the suffix suff. If there is more than one valid index, return the largest of them. If there is no such word in the dictionary, return -1.
 * Example 1:
 * 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".
 * Constraints:
 * 1 <= words.length <= 104
 * 1 <= words[i].length <= 7
 * 1 <= pref.length, suff.length <= 7
 * words[i], pref and suff consist of lowercase English letters only.
 * At most 104 calls will be made to the function f.

 * struct WordFilter {

 * }


 * /** 
 *  * `&self` means the method takes an immutable reference.
 *  * If you need a mutable reference, change it to `&mut self` instead.
 *  */
 * impl WordFilter {

 *     fn new(words: Vec<String>) -> Self {

 *     }

 *     fn f(&self, pref: String, suff: String) -> i32 {

 *     }
 * }
 */
use std::collections::HashMap;

struct WordFilter {
  map: HashMap<String, i32>,
}

impl WordFilter {
  fn new(words: Vec<String>) -> Self {
    let mut map = HashMap::new();
    for (i, word) in words.iter().enumerate() {
      let wlen = word.len();
      for p in 0..=wlen {
        for s in 0..=wlen {
          let key = format!("{}{}{}", &word[..p], '#', &word[wlen-s..]);
          map.insert(key, i as i32);
        }
      }
    }
    WordFilter { map }
  }

  fn f(&self, pref: String, suff: String) -> i32 {
    let key = format!("{}#{}", pref, suff);
    *self.map.get(&key).unwrap_or(&-1)
  }
}