数组中两个字符串的最小距离
数组中两个字符串的最小距离
题目:数组中两个字符串的最小距离
《程序员代码面试指南》第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
建立记录过程就是Record类的构造函数,Record类中的minDistance方法就是做单次查询的方法。
public class Record {
private HashMap> record;
public Record(String[] strArr) {
record = new HashMap>();
HashMap indexMap = new HashMap();
for (int i = 0; i != strArr.length; i++) {
String curStr = strArr[i];
update(indexMap, curStr, i);
indexMap.put(curStr, i);
}
}
private void update(HashMap indexMap, String str, int i) {
if (!record.containsKey(str)) {
record.put(str, new HashMap());
}
HashMap strMap = record.get(str);
for (Entry lastEntry : indexMap.entrySet()) {
String key = lastEntry.getKey();
int index = lastEntry.getValue();
if (!key.equals(str)) {
HashMap 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;
}
}