• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

代码随想录-2023/08/13

武飞扬头像
guaai
帮助1

动态规划

139.单词拆分

解题思路:

  1. 完全背包问题
  2. 字符串数组里面的字符串是物品, 可以无限用 == 完全背包
  3. 字符串s的长度是容量
  4. 现求能否装满背包

代码:

class Solution {
    // 完全背包: 背包容量: 字符串s的长度  物品: 字典里面的字符串
    public boolean wordBreak(String s, List<String> wordDict) {
        // dp[i]: 容量为i, 即字符串长度为(0, i)的背包能否用背包里的物品装满
        // true: 代表当前容量能装满, false: 代表当前容量下不能装满
        boolean[] dp = new boolean[s.length()   1];
        // 背包容量是0的时候, 不用装就是满的
        dp[0] = true;
        // 先遍历背包
        for (int i = 1; i <= s.length(); i  ) {
            // 再遍历物品
            for (String word : wordDict) {
                // word.length() <= i 确保能装下, dp[i-len] 确保上一个状态是能装满的
                // word.equals(s.substring(i - len, i)) 确保当前物品放进来能装满背包
                if (word.length() <= i && dp[i - word.length()] && word.equals(s.substring(i - word.length(), i))) {
                    // 当前背包容量下能装满, 置为true
                    dp[i] = true;
                    // 装满后, 不需要再遍历物品了, 加大容量
                    break;
                }
            }
        }
        // 返回背包容量为n时的状态
        return dp[s.length()];
    }
}

    

解法2 --- 递归 分割字符串

  1. 分割的时候, 判断当前字符串是否符合要求; 若符合, 则开启下一刀分割; 若不符合, 则本层分割终点继续向后移动
  2. 当start走到字符串终点时, 代表有合法分割, 直接返回true
  3. 需要记忆化, 当某个起点分割失败时, 需要记录其失败起点, 并进行记忆化剪枝

代码:

class Solution {
    public boolean wordBreak(String s, List<String> wordDict) {
        int[] memo = new int[s.length()];
        return backtracking(s, wordDict, 0, memo);
    }
    public boolean backtracking(String s, List<String> wordDict, int start, int[]memo){
        // 递归出口
        if(start == s.length()) return true;
        // 提前剪枝
        if(memo[start]  == -1) return false;
        // 横向遍历
        for(int i=start; i<s.length(); i  ){
            String str = s.substring(start, i 1);
            if(!wordDict.contains(str)) continue;
            if(backtracking(s, wordDict, i 1, memo)){
                return true;
            } 
        }
        // 标记以该索引开始的字符串不包含在字典中
        memo[start] = -1;
        return false;
    }
}

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgeejbf
系列文章
更多 icon
同类精品
更多 icon
继续加载