Leetcode----<Re-Space LCCI>

题解如下:

/**
     * 动态规划解法:
     * dp[i] 表示 0-i的最小不能被识别的字母个数
     * 求 dp[k] 如果第K个字母 不能和前面的字母[0-{k-1}]合在一起被识别  那么dp[k] = dp[k-1]+1
     * 如果可以别识别 dp[k] = min(dp[k],dp[j-1])
     *
     * 能不能被识别的判断又有几种解法:
     * 1. 使用HashMap  -- 本题解使用HashMap
     * 2. 使用字典树
     * 3. RK算法
     * 参考链接:https://leetcode-cn.com/problems/re-space-lcci/solution/hui-fu-kong-ge-by-leetcode-solution/
     * @param dictionary
     * @param sentence
     * @return
     */
    public int respace3(String[] dictionary, String sentence) {


        HashMap<String, Integer> map = new HashMap<>();
        for (String s : dictionary) {
            map.put(s,1);
        }
        int length = sentence.length();
        int[] dp = new int[length+1];
        // 由于边界的处理我们让dp[i+1] 表示0-i的最小不能被识别的字母个数
        for (int i = 0; i < length; i++) {
            dp[i+1] = dp[i]+1;
            for (int j = 0; j <= i; j++) {
                if (map.getOrDefault(sentence.substring(j,i+1),0) == 1) {
                    dp[i+1] = Math.min(dp[i+1],dp[j]);
                }
            }
        }
        return dp[length];

    }
posted @ 2020-07-10 00:37  扫地の小沙弥  阅读(94)  评论(0编辑  收藏  举报