Loading

数组中两个字符串的最小距离

数组中两个字符串的最小距离

题目:数组中两个字符串的最小距离

《程序员代码面试指南》第87题 P279 难度:尉★★☆☆

这题原问题很简单。从左到右遍历strs,用变量last1last2分别记录最近一次出现的str1str2的位置。如果遍历到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;
    }

}
posted @ 2022-04-13 19:35  幻梦翱翔  阅读(198)  评论(0)    收藏  举报