Вы можете создать структуру данных поиска
Map<String,List<Finder>>
С Finder
, имеющим int count
и max
и слово res
.Обратите внимание, что список предназначен для того, чтобы позаботиться о случае, когда множество наборов в setToObjMap
могут использовать одно и то же слово, чего нет в ваших примерах.
"telephone" -> [{res:"book",count=0,max=2}]
"hat" -> same object as above
"laugh" -> [{res:"house",count=0,max=3}]
...
Эта коллекция поиска быстро создается идаже быстрее сбрасывать после поиска.
Алгоритм поиска перебирает set
для каждого слова, и каждый Finder для этого слова увеличивает переменную count
.Второй проход, взять все значения карты поиска, если count==max
, поставить res
в результате.
Алгоритм инициализации:
for Entry e in setToObjMap
Finder f = new Finder(e.value, 0, e.key.size) // res, count, max
for String word in e.key
lookup.get(word).add(f)
Алгоритм поиска:
for String word in set
for Finder f in lookup.get(word)
f.count ++
for Finder f in lookup.values()
if (f.count==f.max)
res.add(f.res)
Алгоритм сброса:
for Finder f in lookup.values()
f.count = 0
Что касается сложности, если n равноколичество элементов в set
и m количество значений в setToObjMap
, сложность будет O (n + m)