745. Prefix and Suffix Search
leetcode hard
#csharp#design#hard#hash-table#leetcode#prefix-sum#search#string#tree
Task
Создайте специальный словарь, в котором поиск слов осуществляется по префиксу и суффиксу. Реализуйте класс WordFilter: WordFilter(string[] words) Инициализирует объект со словами в словаре. f(string pref, string suff) Возвращает индекс слова в словаре, которое имеет префикс pref и суффикс suff. Если существует более одного допустимого индекса, возвращается наибольший из них. Если в словаре нет такого слова, возвращается -1.
Пример:
Input: letters = ["c","f","j"], target = "a"
Output: "c"
C# solution
matched/originalusing System;
using System.Collections.Generic;
public class WordFilter {
private Dictionary<string, int> prefixSuffixMap = new Dictionary<string, int>();
public WordFilter(string[] words) {
for (int index = 0; index < words.Length; index++) {
string word = words[index];
int length = word.Length;
for (int prefixLength = 1; prefixLength <= length; prefixLength++) {
for (int suffixLength = 1; suffixLength <= length; suffixLength++) {
string prefix = word.Substring(0, prefixLength);
string suffix = word.Substring(length - suffixLength);
string key = prefix + "#" + suffix;
prefixSuffixMap[key] = index;
}
}
}
}
public int F(string pref, string suff) {
string key = pref + "#" + suff;
return prefixSuffixMap.ContainsKey(key) ? prefixSuffixMap[key] : -1;
}
}C++ solution
auto-draft, review before submit#include <bits/stdc++.h>
using namespace std;
// Auto-generated C++ draft from the C# solution. Review containers, LINQ and helper types before submit.
public class WordFilter {
private unordered_map<string, int> prefixSuffixMap = new unordered_map<string, int>();
public WordFilter(vector<string> words) {
for (int index = 0; index < words.size(); index++) {
string word = words[index];
int length = word.size();
for (int prefixLength = 1; prefixLength <= length; prefixLength++) {
for (int suffixLength = 1; suffixLength <= length; suffixLength++) {
string prefix = word.Substring(0, prefixLength);
string suffix = word.Substring(length - suffixLength);
string key = prefix + "#" + suffix;
prefixSuffixMap[key] = index;
}
}
}
}
public int F(string pref, string suff) {
string key = pref + "#" + suff;
return prefixSuffixMap.count(key) ? prefixSuffixMap[key] : -1;
}
}Java solution
matched/originalpublic class WordFilter {
private Map<String, Integer> prefixSuffixMap = new HashMap<>();
public WordFilter(String[] words) {
for (int index = 0; index < words.length; index++) {
String word = words[index];
int length = word.length();
for (int prefixLength = 1; prefixLength <= length; prefixLength++) {
for (int suffixLength = 1; suffixLength <= length; suffixLength++) {
String prefix = word.substring(0, prefixLength);
String suffix = word.substring(length - suffixLength);
String key = prefix + "#" + suffix;
prefixSuffixMap.put(key, index);
}
}
}
}
public int f(String pref, String suff) {
String key = pref + "#" + suff;
return prefixSuffixMap.getOrDefault(key, -1);
}
}JavaScript solution
matched/originalclass WordFilter {
constructor(words) {
this.prefixSuffixMap = new Map();
for (let index = 0; index < words.length; index++) {
const word = words[index];
const length = word.length;
for (let prefixLength = 1; prefixLength <= length; prefixLength++) {
for (let suffixLength = 1; suffixLength <= length; suffixLength++) {
const prefix = word.substring(0, prefixLength);
const suffix = word.substring(length - suffixLength);
const key = prefix + '#' + suffix;
this.prefixSuffixMap.set(key, index);
}
}
}
}
f(pref, suff) {
const key = pref + '#' + suff;
return this.prefixSuffixMap.has(key) ? this.prefixSuffixMap.get(key) : -1;
}
}Python solution
matched/originalclass WordFilter:
def __init__(self, words):
self.prefix_suffix_map = {}
for index, word in enumerate(words):
length = len(word)
for prefix_length in range(1, length + 1):
for suffix_length in range(1, length + 1):
key = word[:prefix_length] + '#' + word[-suffix_length:]
self.prefix_suffix_map[key] = index
def f(self, pref, suff):
key = pref + '#' + suff
return self.prefix_suffix_map.get(key, -1)Go solution
matched/originalpackage main
type WordFilter struct {
prefixSuffixMap map[string]int
}
func Constructor(words []string) WordFilter {
prefixSuffixMap := make(map[string]int)
for index, word := range words {
length := len(word)
for prefixLength := 1; prefixLength <= length; prefixLength++ {
for suffixLength := 1; suffixLength <= length; suffixLength++ {
prefix := word[:prefixLength]
suffix := word[length-suffixLength:]
key := prefix + "#" + suffix
prefixSuffixMap[key] = index
}
}
}
return WordFilter{prefixSuffixMap}
}
func (wf *WordFilter) F(pref string, suff string) int {
key := pref + "#" + suff
if index, exists := wf.prefixSuffixMap[key]; exists {
return index
}
return -1
}Explanation
Algorithm
Сохраните слова и их индексы в словаре.
Создайте объединенные ключи, состоящие из префиксов и суффиксов для всех возможных комбинаций.
Реализуйте функцию поиска, которая ищет наибольший индекс слова по префиксу и суффиксу.
😎