题解 | #训练聪明的牛#

训练聪明的牛

https://www.nowcoder.com/practice/971090dbcf5043e295b4ea7f6ec85311

一、知识点:

动态规划

二、文字分析:

我们定义一个长度为n的布尔数组dp,其中dp[i]表示字符串s的前i个字符是否可以由词汇表中的单词拆分而成。

状态转移方程为:

  • 如果dp[j]为true且字符串s从第j+1个字符到第i个字符(即s.substring(j+1, i+1))在词汇表中,也即wordDict.contains(s.substring(j+1, i+1))为true,则dp[i]为true。

初始化:

  • dp[0]为true,表示空字符串可以由词汇表中的单词拆分而成。

最终结果为dp[n],其中n为字符串s的长度。

时间复杂度:

  • 两层循环遍历字符串s的所有子串,时间复杂度为O(n^2)。
  • 在内层循环中,判断子串是否在词汇表中需要O(1)的时间(使用Set存储词汇表并进行查找)。

因此,算法的总体时间复杂度为O(n^2)。

空间复杂度:

  • 需要一个长度为n+1的布尔数组dp来保存每个子串是否可以拆分成词汇表中的单词,空间复杂度为O(n+1)。
  • 需要一个Set来存储词汇表中的单词,空间复杂度取决于词汇表的大小,可以认为是O(m),其中m是词汇表中单词的数量。

因此,算法的总体空间复杂度为O(n+m)。

三、编程语言:

java

四、正确代码:

import java.util.*;


public class Solution {
    public boolean wordBreak(String s, String[] wordDict) {
        int n = s.length();
        Set<String> wordSet = new HashSet<>(Arrays.asList(wordDict));

        boolean[] dp = new boolean[n + 1];
        dp[0] = true;

        for (int i = 1; i <= n; i++) {
            for (int j = 0; j < i; j++) {
                if (dp[j] && wordSet.contains(s.substring(j, i))) {
                    dp[i] = true;
                    break;
                }
            }
        }

        return dp[n];
    }
}

全部评论

相关推荐

07-17 11:50
门头沟学院 Java
投递腾讯等公司7个岗位
点赞 评论 收藏
分享
Twilight_m...:表格简历有点难绷。说说个人看法: 1.个人基本情况里好多无意义信息,什么婚姻状况、健康状况、兴趣爱好、户口所在地、身份证号码、邮政编码,不知道的以为你填什么申请表呢。 2.校内实践个人认为对找工作几乎没帮助,建议换成和测开有关的项目,实在没得写留着也行。 3.工作经历完全看不出来是干什么的,起码看着和计算机没啥关系,建议加强描述,写点你在工作期间的实际产出、解决了什么问题。 4.个人简述大而空,看着像AI生成,感觉问题最大。“Python,C,C++成为我打造高效稳定服务的得力工具”、“我渴望凭借自身技术知识与创新能力,推动人工智能技术的应用发展,助力社会实现智能化转型”有种小学作文的美感。而且你确定你个人简述里写的你都会嘛?你AI这块写的什么“深入研究”,发几篇顶会的硕博生都不一定敢这么写。而且你AI这块的能力和软测也完全无关啊。个人简述建议写你对哪些技术栈、哪些语言、哪些生产工具的掌握,写的有条理些,而且最好是和测开强相关的。
点赞 评论 收藏
分享
Lorn的意义:1.你这根本就不会写简历呀,了解太少了 2.你这些项目经历感觉真的没啥亮点啊,描述的不行,重写书写一下让人看到核心,就继续海投 注意七八月份ofer还是比较多的,越往后机会越少,抓住时机,抓紧检查疏漏,加油查看图片
点赞 评论 收藏
分享
评论
2
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务