美文网首页
1048. Longest String Chain

1048. Longest String Chain

作者: 尚无花名 | 来源:发表于2019-05-19 21:48 被阅读0次

这是一道常规题。
very straightforward problem.
build the graph first.
Traverse the graph and find the longest path you can have.
I am using depth first search while using memo to speed thing up.

class Solution {
    public int longestStrChain(String[] words) {
        Map<Integer, List<Integer>> lenList = new HashMap<>();
        int min = Integer.MAX_VALUE, max = 0;
        for (int i = 0; i < words.length; i++) {
            int len = words[i].length();
            lenList.putIfAbsent(len, new ArrayList<>());
            lenList.get(len).add(i);
            min = Math.min(min, len);
            max = Math.max(max, len);
        }
        Map<Integer, List<Integer>> graph = new HashMap<>();
        buildGraph(words, graph, lenList, min, max); //build graph
        Map<Integer, Integer> maxLength = new HashMap<>(); // hashMap for memo
        int ans = 0;
        for (int i = 0; i < words.length; i++) {
            ans = Math.max(ans, dfs(i, maxLength, graph)); // DFS
        }
        return ans;
    }
  
    
    private int dfs(int index, Map<Integer, Integer> mem,  Map<Integer, List<Integer>> graph) {
        if (mem.containsKey(index)) return mem.get(index);
        if (graph.get(index) == null) {
            mem.put(index, 1);
            return 1;
        }
        int ans = 1;
        for (int downStream : graph.get(index)) ans = Math.max(ans, 1 + dfs(downStream, mem, graph));
        mem.put(index, ans);
        return ans;
    }
    
    private void buildGraph(String[] words, Map<Integer, List<Integer>> graph, 
                            Map<Integer, List<Integer>> lenList, int min, int max) {
        for (int len = min; len < max; len++) {
            List<Integer> lenWords = lenList.get(len);
            List<Integer> lenPlusOneWords = lenList.get(len + 1);
            if (lenWords == null || lenPlusOneWords == null 
                || lenWords.size() == 0 || lenPlusOneWords.size() == 0) continue;
            
            for (int m : lenWords) {
                for (int n : lenPlusOneWords) {
                    boolean res = isPredecessor(words[m], words[n]);
                    if (isPredecessor(words[m], words[n])) {
                        graph.putIfAbsent(m, new ArrayList<>());
                        graph.get(m).add(n);
                    }
                }
            }
        }
    }
    private boolean isPredecessor(String w1, String w2) {
        if (w1 == null || w2 == null) return false;
        if (w1.length() + 1 != w2.length()) return false;
        for (int i = 0; i < w1.length(); i++) {
            if (w1.charAt(i) != w2.charAt(i))  return match(w1, i, w2);
        }
        return true;
    }
    private boolean match(String w1, int i, String w2) {
        while (i < w1.length()) {
            if (w1.charAt(i) != w2.charAt(++i)) return false;
        }
        return true;
    }
}

相关文章

网友评论

      本文标题:1048. Longest String Chain

      本文链接:https://www.haomeiwen.com/subject/rjkczqtx.html