面试题 17.11. 单词距离【中等题】【每日一题】
思路:【哈希表】
建立一个哈希
map
,以单词为key
,以列表为value
,将每个单词的下标存入单词key
对应的value
列表中。
取出题目要求的两个单词对应的列表,遍历两个列表,求出列表中元素,即单词对应下标的差值绝对值的最小值。
我觉得求出距离最小值的方式还可以通过二分查找优化,毕竟两个单词列表中的元素都是递增的,但是我感觉对我来说实现起来有点难度,算了,能AC
就行,直接下一题了。
代码:
class Solution {
public int findClosest(String[] words, String word1, String word2) {
Map<String, List<Integer>> map = new HashMap<>();
int n = words.length;
for (int i = 0; i < n; i++) {
String key = words[i];
List<Integer> list = map.getOrDefault(key,new ArrayList<>());
list.add(i);
map.put(key,list);
}
List<Integer> list1 = map.get(word1),list2 = map.get(word2);
int min = Integer.MAX_VALUE;
for (Integer integer : list1) {
for (Integer value : list2) {
min = Math.min(min, Math.abs(integer - value));
}
}
return min;
}
}
剑指 Offer II 063. 替换单词【中等题】
思路:【哈希】
其实用哈希是比较偷鸡,纯纯暴力模拟。但是俺真的想不到构建前缀树~,今天比较忙,学习前缀树的解法就拜托给下次一定了。
我的解法是真的慢~
代码:
class Solution {
public String replaceWords(List<String> dictionary, String sentence) {
Set<String> set = new HashSet<>(dictionary);
StringBuilder sb = new StringBuilder();
String[] words = sentence.split(" ");
for (String word : words) {
int n = word.length();
boolean flag = true;
for (int i = 1; i <= n; i++) {
String ready = word.substring(0,i);
if (set.contains(ready)){
sb.append(ready);
sb.append(" ");
flag = false;
break;
}
}
if (flag){
sb.append(word);
sb.append(" ");
}
}
return sb.toString().trim();
}
}