当前位置: 首页 > article >正文

leetcode hot100【LeetCode 139. 单词拆分】java实现

LeetCode 139. 单词拆分

题目描述

给定一个非空字符串 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"。
     注意你可以重复使用字典中的单词。

示例 3:

输入: s = "catsandog", wordDict = ["cats", "dog", "sand", "and", "cat"]
输出: false

Java 实现代码

class Solution {
    public boolean wordBreak(String s, List<String> wordDict) {
        // 将词典转换为集合,方便快速查找
        Set<String> wordSet = new HashSet<>(wordDict);
        // 初始化dp数组,dp[i]表示s[0:i]是否可以被拆分
        boolean[] dp = new boolean[s.length() + 1];
        dp[0] = true;  // 空字符串可以被拆分
        // 遍历字符串s的每个位置
        for (int i = 1; i <= s.length(); i++) {
            // 检查从前面的某个位置j到当前位置i的子串是否在wordDict中
            for (int j = 0; j < i; j++) {
                // 如果dp[j]为true,并且s[j:i]在wordDict中,则更新dp[i]
                if (dp[j] && wordSet.contains(s.substring(j, i))) {
                    dp[i] = true;
                    break;  // 找到满足条件的子串后,跳出循环
                }
            }
        }
        // 返回s[0:n]是否可以被拆分
        return dp[s.length()];
    }
}

解题思路

  1. 初始化:创建一个布尔数组 dp,长度为 s.length() + 1,其中 dp[i] 表示字符串 s 的前 i 个字符能否被拆分成字典中的单词。初始化 dp[0]true,因为空字符串可以被拆分。

  2. 状态转移:遍历字符串 s 的每个位置 i,对于每个位置 i,再遍历之前的每个位置 j,判断 dp[j] 是否为 true,并且 s.substring(j, i) 是否在 wordDict 中。

  3. 结果返回:最终返回 dp[s.length()],表示整个字符串 s 是否可以被拆分。

复杂度分析

  • 时间复杂度:O(n^2),其中 n 是字符串 s 的长度。最坏情况下,我们需要检查所有子串。
  • 空间复杂度:O(n),需要一个大小为 n + 1 的数组 dp 来存储中间结果。

http://www.kler.cn/a/377762.html

相关文章:

  • HTML 基础标签——结构化标签<html>、<head>、<body>
  • Unity SRP学习笔记(二)
  • 使用 AMD GPU 的 ChatGLM-6B 双语语言模型
  • 从 vue 源码看问题 — vue 编译器的解析
  • 求平面连接线段组成的所有最小闭合区间
  • 微信公众号绑定设计-WeChat public platform bing and send message
  • NLP segment-01-聊一聊分词 AI 的基础
  • flutter 写个简单的界面
  • H5页面在线预览pdf
  • ceph补充介绍
  • [论文阅读]A Survey of Embodied Learning for Object-Centric Robotic Manipulation
  • 编写dockerfile生成镜像,并且构建容器运行
  • Javascript数据结构与算法——栈与队列
  • 自然语言处理领域中的两个主要技术挑战:实体歧义和上下文管理
  • 网络模型——二层转发原理
  • 如何使用python轻松入手文本数据分析?
  • vue项目安装组件失败解决方法
  • element-plus 修改主题色(按需导入)
  • 【android12】【AHandler】【1.AHandler异步无回复消息原理篇】
  • 整合 flatten-maven-plugin 插件:解决子模块单独打包失败问题
  • 字符串左旋 (干货无废话)
  • flutter-防抖
  • 如何使用AdsPower指纹浏览器克服爬虫技术限制,安全高效进行爬虫!
  • 阿里国际2025届校园招聘 0826算法岗笔试
  • 【JavaEE初阶】深入理解TCP协议特性之延时应答,捎带应答,面向字节流以及异常处理
  • 修改 Docker 镜像默认存储位置的方法