139. Word Break
Link: https://leetcode.com/problems/word-break/
Description
Given a string s
and a dictionary of strings wordDict
, return true
if s
can be segmented into a space-separated sequence of one or more dictionary words.
Note that the same word in the dictionary may be reused multiple times in the segmentation.
Approach
- Initialize a boolean
dp
array to keep track of whether the substring ending at indexi
can be segmented into words from thewordDict
. - Create a HashSet
set
withwordDict
to check if a substring is a valid word. - Set dp[0] to true, indicating that an empty string can always be segmented.
- Iterate through the string
s
using a loop withi
ranging from1
to the length ofs
. For eachi
, iterate through another loop withj
ranging from0
toi
. The purpose of this nested loop is to explore different substrings within the strings
.- Check if the substring from index
j
to indexi
is present in the set and ifdp[j]
is alsotrue
. If both conditions are met, it means that the substring fromj
toi
can be segmented, so setdp[i]
totrue
.
- Check if the substring from index
Solution
class Solution {
public boolean wordBreak(String s, List<String> wordDict) {
Set<String> set = new HashSet<>(wordDict);
boolean[] dp = new boolean[s.length() + 1];
dp[0] = true;
for (int i = 1; i <= s.length(); i++) {
for (int j = 0; j < i && !dp[i]; j++) {
if (set.contains(s.substring(j, i)) && dp[j])
dp[i] = true;
}
}
return dp[s.length()];
}
}