数组中两个字符串的最小距离
数组中两个字符串的最小距离
《程序员代码面试指南》第87题 P279 难度:尉★★☆☆
这题原问题很简单。从左到右遍历strs,用变量last1、last2分别记录最近一次出现的str1、str2的位置。如果遍历到str1,那么i-last2的值就是当前str1和左边离它最近的str2之间的距离;如果遍历到str2,那么i-last1的值就是当前str2和左边离它最近的str1之间的距离。用变量min记录这些距离的最小值即可。
public int minDistance(String[] strs, String str1, String str2) {
if (str1 == null || str2 == null) {
return -1;
}
if (str1.equals(str2)) {
return 0;
}
int last1 = -1;
int last2 = -1;
int min = Integer.MAX_VALUE;
for (int i = 0; i != strs.length; i++) {
if (strs[i].equals(str1)) {
min = Math.min(min, last2 == -1 ? min : i - last2);
last1 = i;
}
if (strs[i].equals(str2)) {
min = Math.min(min, last1 == -1 ? min : i - last1);
last2 = i;
}
}
return min == Integer.MAX_VALUE ? -1 : min;
}
进阶问题主要是用一个哈希表HashMap<String, HashMap<String, Integer>>来记录。生成记录的时间复杂度和空间复杂度为O(N²),生成记录后单次查询操作的时间复杂度可降为O(1)。外哈希表的key代表strs中的某种字符串,所对应的内哈希表表示其他字符串到key字符串的最小距离。
建立记录过程就是Record类的构造函数,Record类中的minDistance方法就是做单次查询的方法。
public class Record {
private HashMap<String, HashMap<String, Integer>> record;
public Record(String[] strArr) {
record = new HashMap<String, HashMap<String, Integer>>();
HashMap<String, Integer> indexMap = new HashMap<String, Integer>();
for (int i = 0; i != strArr.length; i++) {
String curStr = strArr[i];
update(indexMap, curStr, i);
indexMap.put(curStr, i);
}
}
private void update(HashMap<String, Integer> indexMap, String str, int i) {
if (!record.containsKey(str)) {
record.put(str, new HashMap<String, Integer>());
}
HashMap<String, Integer> strMap = record.get(str);
for (Entry<String, Integer> lastEntry : indexMap.entrySet()) {
String key = lastEntry.getKey();
int index = lastEntry.getValue();
if (!key.equals(str)) {
HashMap<String, Integer> lastMap = record.get(key);
int curMin = i - index;
if (strMap.containsKey(key)) {
int preMin = strMap.get(key);
if (curMin < preMin) {
strMap.put(key, curMin);
lastMap.put(str, curMin);
}
} else {
strMap.put(key, curMin);
lastMap.put(str, curMin);
}
}
}
}
public int minDistance(String str1, String str2) {
if (str1 == null || str2 == null) {
return -1;
}
if (str1.equals(str2)) {
return 0;
}
if (record.containsKey(str1) && record.get(str1).containsKey(str2)) {
return record.get(str1).get(str2);
}
return -1;
}
}

浙公网安备 33010602011771号