题解 | #训练聪明的牛# Java

训练聪明的牛

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

定义一个布尔数组dp,其中dp[i]表示字符串s的前i个字符能否被拆分成词汇表wordDict中的单词。

首先,我们需要初始化dp数组的边界条件。将dp[0]设为true,表示空串可以被拆分成空单词。

然后,我们可以通过递推关系式来更新dp数组的其他位置。对于dp[i],我们可以将字符串s的前i个字符拆分为两部分:s[0:i-1]和s[i:n-1](其中n是字符串s的长度)。如果s[0:i-1]可以被拆分成词汇表wordDict中的单词,并且s[i:n-1]在wordDict中,那么dp[i]为true。即,如果存在j(0≤j<i),使得dp[j]为true并且s[j:i-1]在wordDict中,那么dp[i]为true。

最后,遍历完整个字符串s后,dp[s.length()]的值即为字符串s能否被拆分成词汇表wordDict中的单词。

import java.util.*;


public class Solution {

    public boolean wordBreak(String s, String[] wordDict) {

        boolean[] dp = new boolean[s.length() + 1];
        dp[0] = true;
        for (int i = 1; i <= s.length(); i++) {
            for (String word : wordDict) {
                int len = word.length();
                if (i >= len && s.substring(i - len, i).equals(word) && dp[i - len]) {
                    dp[i] = true;
                    break;
                }
            }
        }
        return dp[s.length()];
    }

}

算法题刷刷刷 文章被收录于专栏

数组、链表、栈、队列、堆、树、图等。 查找和排序:二分查找、线性查找、快速排序、归并排序、堆排序等。 动态规划:背包问题、最长公共子序列、最短路径 贪心算法:活动选择、霍夫曼编码 图:深度优先搜索、广度优先搜索、拓扑排序、最短路径算法(如 Dijkstra、Floyd-Warshall) 字符串操作:KMP 算法、正则表达式匹配 回溯算法:八皇后问题、0-1 背包问题 分治算法:归并排序、快速排序

全部评论

相关推荐

牛客539033066号:放心吧,这里面一大半都不会去面试的,剩下一半面过了最后还是回拒,实际上免笔试的那些bg的人,没多少愿意去这些岗位,薪资水平在那里
点赞 评论 收藏
分享
2024-12-04 14:01
南京理工大学 Python
thanker:byd985废物收容所
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务