题解 | #训练聪明的牛#
训练聪明的牛
https://www.nowcoder.com/practice/971090dbcf5043e295b4ea7f6ec85311
知识点:动态规划
关于能否组成一个字符串,是由两部分决定:
1.前半部分是否已经是可组合成的字符串
2.后半部分字符串是否存在于字符字典中
当两个条件都满足时,说明当前字符串可由字符字典组成。
我们可以定义一个状态dp[i],表示从0到当前位置i的字符串是可以组成的,对于dp[0],我们初始化为true,表示没有字符串,也就是不使用字符字典的任何字符串也可以组成。对于每个位置dp[i]来说,我们可以遍历前面所有位置,若都满足上述两个条件,则置为true,遍历整个数组,得到dp[n]即为答案。
Java题解如下
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param s string字符串 * @param wordDict string字符串一维数组 * @return bool布尔型 */ public boolean wordBreak (String s, String[] wordDict) { // write code here int n = s.length(); boolean[] dp = new boolean[n + 1]; dp[0] = true; Set<String> set = new HashSet<>(); for(String word: wordDict) { set.add(word); } for(int i = 1; i <= n; i++) { for(int j = 0; j <= i; j++) { if(dp[j] && set.contains(s.substring(j, i))) { dp[i] = true; break; } } } return dp[n]; } }