0524. Longest Word in Dictionary through Deleting
Description
**Input:** s = "abpcplea", dictionary = ["ale","apple","monkey","plea"]
**Output:** "apple"**Input:** s = "abpcplea", dictionary = ["a","b","c"]
**Output:** "a"ac
class Solution {
public String findLongestWord(String s, List<String> d) {
// edge cases
if (s.length() == 0 || d.size() == 0) return "";
// build search table
List<Integer>[] map = new List[26];
for (int i = 0; i < s.length(); i++) {
int pos = s.charAt(i) - 'a';
if (map[pos] == null) map[pos] = new ArrayList<>();
map[pos].add(i);
}
// search word in d
String res = "";
for (String w : d) {
if (!valid(map, w)) continue;
if (w.length() > res.length()
|| w.length() == res.length() && w.compareTo(res) < 0)
res = w;
}
return res;
}
private boolean valid(List<Integer>[] map, String w) {
int prevCharIdx = 0;
for (char c : w.toCharArray()) {
int pos = c - 'a';
if (map[pos] == null) return false; // this char not even in s
int idx = Collections.binarySearch(map[pos], prevCharIdx);
if (idx < 0) idx = - idx - 1; // < 0 means cant find, return (-insertion point -1)
if (idx >= map[pos].size()) return false; // cant find this char
prevCharIdx = map[pos].get(idx) + 1;
}
return true;
}
}
/*
build a search table on s, each time search d is faster.
*/Last updated