首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >139. 单词拆分

139. 单词拆分

作者头像
名字是乱打的
发布2021-12-23 19:00:20
发布2021-12-23 19:00:20
45200
代码可运行
举报
文章被收录于专栏:软件工程软件工程
运行总次数:0
代码可运行
题目
代码语言:javascript
代码运行次数:0
运行
复制
  /**
     * 给定一个非空字符串 s 和一个包含非空单词的列表 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。
     * 说明:
     * 拆分时可以重复使用字典中的单词。
     * 你可以假设字典中没有重复的单词。
     *
     * 示例 1:
     * 输入: s = "leetcode", wordDict = ["leet", "code"]
     * 输出: true
     * 解释: 返回 true 因为 "leetcode" 可以被拆分成 "leet code"。
     * 
     * 示例 2:
     * 输入: s = "applepenapple", wordDict = ["apple", "pen"]
     * 输出: true
     * 解释: 返回 true 因为 "applepenapple" 可以被拆分成 "apple pen apple"。
     * 注意你可以重复使用字典中的单词。
     */

思路:

  • 1.这是一个完全背包问题,本题可以转换为是否可以用现有单词拼成该字符串
  • 2.我们可以把问题逐步拆分,比如一个applepenapple,我们可以先看applepen可不可以组成,applepen可以组成applepenapple就等于applepen和apple,以此递推

代码:

代码语言:javascript
代码运行次数:0
运行
复制
   public boolean wordBreak(String s, List<String> wordDict) {
        Set<String> words = new HashSet<>(wordDict);

        boolean[] hasCheck = new boolean[s.length() + 1];

        //hasCheck[i]表示:字符串的前i个字符是否可以由背包中的单词组成
        hasCheck[0] = true;

        // 如果确定hasCheck[j] 是true,且 [j, i] 这个区间的子串出现在字典里,那么dphasChecki]一定是true。(j < i )。
        // 所以递推公式是 if([j, i] 这个区间的子串出现在字典里 && hasCheck[j]是true) 那么 dp[i] = true。

        for (int i = 1; i <= s.length(); i++) {
            //倒着遍历,考虑到单词长度可能远小于target长度,倒着遍历效率更高
            for (int j = i - 1; j >= 0; j--) {
                if (!hasCheck[j]) {
                    continue;
                }

                if (hasCheck[j] && words.contains(s.substring(j, i ))) {
                    hasCheck[i] = true;
                    break;
                }
            }
        }

        return hasCheck[s.length()];
    }
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/10/22 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目
  • 思路:
  • 代码:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档