题解 | #训练聪明的牛# 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 背包问题 分治算法:归并排序、快速排序