• 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
  • 相关阅读:
    【BZOJ2243】【SDOI2011】染色 (LCT)
    【BZOJ2631】tree (LCT)
    【BZOJ3626】【LNOI2014】LCA (树剖+离线)
    [BZOJ3244][NOI2013] 树的计数
    BZOJ2754 SCOI2012day1T2喵星球上的点名(后缀数组)
    BZOJ2753 SCOI2012day1T1滑雪与时间胶囊(bfs+kruskal)
    Swift
    Library not loaded: @rpath/libswiftCore.dylib
    PHP require include 区别
    Mac OS 下 eclipse中文乱码解决方法
  • 原文地址:https://www.cnblogs.com/whesuanfa/p/6821981.html
Copyright © 2020-2023  润新知