zoukankan      html  css  js  c++  java
  • Leetcode 17.15 最长单词 剪枝与记忆化

      主函数的剪枝,判断单词是否由数组中的单词组成的函数的记忆化。

    public final String longestWord(String[] words) {
            Arrays.sort(words, (o1, o2) -> {
                if (o1.length() == o2.length()) return o1.compareTo(o2);
                else return Integer.compare(o2.length(), o1.length());
            });
            Set<String> set = new HashSet<String>();
            for (String word : words) set.add(word);
            for (String word : words) {
                set.remove(word);
                if (isCompose(word, word.length(), set, new int[word.length() + 1])) return word;
            }
            return "";
        }
    
        private final boolean isCompose(String target, int point, Set<String> set, int[] cache) {
            if (point == 0) return true;
            if (cache[point] != 0) return cache[point] == 1;
            for (int i = point - 1; i >= 0; i--) {
                String last = target.substring(i, point);
                if (set.contains(last) && isCompose(target, i, set, cache)) {
                    cache[point] = 1;
                    break;
                } else cache[point] = -1;
            }
            return cache[point] == 1;
        }

    当你看清人们的真相,于是你知道了,你可以忍受孤独
  • 相关阅读:
    用价值链分析软件开发及杂感
    《恰如其分的软件架构》笔记摘要
    观察者模式
    Js中Date对象
    Js中Currying的应用
    read命令
    模板方法模式
    两两交换链表中的节点
    享元模式
    Js中Array对象
  • 原文地址:https://www.cnblogs.com/niuyourou/p/14909838.html
Copyright © 2011-2022 走看看