State

dp[i] = can we break s[0..i-1] into dictionary words?

Advertisement

Transition

boolean[] dp = new boolean[s.length() + 1];
dp[0] = true;
for (int i = 1; i <= s.length(); i++)
  for (int j = 0; j < i; j++)
    if (dp[j] && dict.contains(s.substring(j, i))) {
      dp[i] = true; break;
    }
return dp[s.length()];
Advertisement

Complexity

O(N² × K) where K = substring lookup cost. Use HashSet for O(1) contains.

Return actual sentences

Similar DP but track predecessors. Backtrack to reconstruct all valid segmentations.