Dynamic Programming

1 44 Wildcard Match  双指针

    public boolean isMatch(String s, String p) {
        int idxs = 0, idxp = 0, idxstart = -1, idxmatch = 0;
        while (idxs < s.length())
        {
            if (idxp < p.length() && (s.charAt(idxs) == p.charAt(idxp) || p.charAt(idxp) == '?'))
            {
                idxp++; idxs++;
            }
            else if (idxp < p.length() && p.charAt(idxp) == '*')
            {
                idxstart = idxp;
                idxp++;
                idxmatch = idxs;
            }
            else if (idxstart != -1)
            {
                idxp = idxstart + 1;
                idxmatch++;
                idxs = idxmatch;
            }
            else
            {
                return false;
            }
        }
         while(idxp < p.length() && p.charAt(idxp) == '*'){
            idxp++;
        }
         return idxp == p.length();
    }
View Code

2 70 Climbing Stairs

    public int climbStairs(int n) {
        int i1 = 1;
        if (n == 1) return i1;
        int i2 = 2;
        for (int i = 3; i <= n; i++)
        {
            i2 = i1+i2;
            i1 = i2 - i1;
        }
        return i2;
    }
View Code

3 72 Edit Distance

    public int minDistance(String word1, String word2) {
        int[] dp = new int[word2.length() + 1];
        for (int i = 0; i < word2.length() + 1; i++)
        {
            dp[i] = i;
        }
        for (int i = 0; i < word1.length(); i++)
        {
            int[] cur = new int[word2.length() + 1];
            cur[0] = i + 1;
            for (int j = 0; j < word2.length(); j++)
            {
                if (word1.charAt(i) == word2.charAt(j)) cur[j + 1] = dp[j];
                else
                {
                    cur[j + 1] = Math.min(dp[j], Math.min(dp[j+1], cur[j])) + 1;
                }
            }
            dp = cur;
        }
        return dp[word2.length()];
    }
View Code

 5 月 8日 

4 96 Unique Binary Search Tree  卡特兰数

    public int numTrees(int n) {
        int[] res = new int[n + 1];
        res[0] = 1; res[1] = 1;
        for (int i = 2; i <= n; i++)
        {
            for (int j = 0; j < i; j++)
            {
                res[i] += res[j] * res[i - j - 1];
            }
        }
        return res[n];
    }
View Code

5 95 Unique Binary Search Tree  II   上一题变形

    public List<TreeNode> generateTrees(int n) {
        List<TreeNode> res = new ArrayList<>();
        if (n <= 0) return res;
        return help(1, n);
    }
    public List<TreeNode> help(int l, int r)
    {
        List<TreeNode> res = new ArrayList<>();
        if (l > r)
        {
            res.add(null);
            return res;
        }
        for (int i = l; i <= r; i++)
        {
            List<TreeNode> lres = help(l, i - 1);
            List<TreeNode> rres = help(i + 1, r);
            for (int j = 0; j < lres.size(); j++)
            {
                for (int k = 0; k < rres.size(); k++)
                {
                    TreeNode root = new TreeNode(i);
                    root.left = lres.get(j);
                    root.right = rres.get(k);
                    res.add(root);
                }
            }
        }
        return res;
    }
View Code

6 132 Palindrome Partitioning II    二位布尔和一维数

    public int minCut(String s) {
        char[] c = s.toCharArray();
        int n = c.length;
        int[] res = new int[n];
        boolean[][] help = new boolean[n][n];
        for (int i = 0; i < n; i++)
        {
            int min = i;
            for (int j = 0; j <= i; j++)
            {
                if (c[i] == c[j] && (j + 1 > i - 1 || help[j+1][i-1]))
                {
                    help[j][i] = true;
                    min = j == 0? 0 : Math.min(min, res[j - 1] + 1);
                }
            }
            res[i] = min;
        }
        return res[n - 1];
    }
View Code

7 139 word Break     分两段

    public boolean wordBreak(String s, List<String> d) {
        Set<String> dict = new HashSet<>(d);
        boolean [] breakable = new boolean[s.length()+1];
        breakable[0] = true;

        for (int i = 1; i <= s.length(); i++)
        {
            for (int j = 0; j < i; j++)
            {
                if (breakable[j] && dict.contains(s.substring(j,i)))
                {
                    breakable[i] = true;
                    break;
                }
            }
        }
        return breakable[s.length()];
    }
View Code

 5月9号

8  140 WORD BREAK ii深度优先搜索

    public List<String> wordBreak(String s, List<String> wordDict) {
            Set<String> words = new HashSet<>(wordDict);
            return DFS(s, words, new HashMap<String, LinkedList<String>>());
        }
        List<String> DFS(String s, Set<String> words, HashMap<String, LinkedList<String>> map){
            if (map.containsKey(s))  return map.get(s);
            LinkedList<String> res = new LinkedList<String>();
            if (s.length() == 0) { res.add(""); return res;}
            for (String word : words){
                if (s.startsWith(word)){
                    List<String> sublist = DFS(s.substring(word.length()), words, map);
                    for (String sub : sublist)
                        res.add(word + (sub.isEmpty() ? "":" ") + sub);
                }
            }
            map.put(s, res);
            return res;
        }
View Code

9 198 House Robber   分奇偶

private int rob(int[] num, int lo, int hi) {
    int include = 0, exclude = 0;
    for (int j = lo; j <= hi; j++) {
        int i = include, e = exclude;
        include = e + num[j];
        exclude = Math.max(e, i);
    }
    return Math.max(include, exclude);
}
View Code

10 213  House Robber  拍第一和最后 比较

    public int rob(int[] nums) {
        if (nums.length == 1) return nums[0];
    return Math.max(rob(nums, 0, nums.length - 2), rob(nums, 1, nums.length - 1));
    }
    private int rob(int[] num, int lo, int hi) {
    int include = 0, exclude = 0;
    for (int j = lo; j <= hi; j++) {
        int i = include, e = exclude;
        include = e + num[j];
        exclude = Math.max(e, i);
    }
    return Math.max(include, exclude);
}
View Code

11 221 Maximal Square  看上左

    public int maximalSquare(char[][] matrix) {
        if(matrix.length == 0) return 0;
        int m = matrix.length, n = matrix[0].length, res = 0;
        int[][] dp = new int[m + 1][n + 1];
        for (int i = 1; i <= m; i++)
        {
            for (int j = 1; j <= n; j++)
            {
                if (matrix[i - 1][j - 1] == '1')
                {
                    dp[i][j] = Math.min(dp[i - 1][j], Math.min(dp[i - 1][j - 1], dp[i][j-1])) + 1;
                    res = Math.max(dp[i][j], res);
                }
            }
        }
        return res * res;
    }
View Code
原文地址:https://www.cnblogs.com/whesuanfa/p/6821981.html