LeetCode-in-All

139. Word Break

Medium

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.

Example 1:

Input: s = “leetcode”, wordDict = [“leet”,”code”]

Output: true

Explanation: Return true because “leetcode” can be segmented as “leet code”.

Example 2:

Input: s = “applepenapple”, wordDict = [“apple”,”pen”]

Output: true

Explanation: Return true because “applepenapple” can be segmented as “apple pen apple”.

Note that you are allowed to reuse a dictionary word.

Example 3:

Input: s = “catsandog”, wordDict = [“cats”,”dog”,”sand”,”and”,”cat”]

Output: false

Constraints:

Solution

class Solution {
  bool wordBreak(String s, List<String> wordDict) {
    Map<String, bool> memo = {};
    bool solve(String s1) {
      if (s1.length == 0) return true;
      if (memo.containsKey(s1)) {
        return memo[s1]!;
      }
      bool ans = false;
      for (var word in wordDict) {
        if (word.length > s1.length) continue;
        String s2 = s1.substring(0, word.length);
        if (s2 == word) {
          ans |= solve(s1.substring(word.length));
        }
      }
      memo[s1] = ans;
      return ans;
    }

    return solve(s);
  }
}