LeetCode-in-Net.github.io

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

public class Solution {
    private Dictionary<string, bool> visited = new();
    private HashSet<string>? set;

    public bool WordBreak(string s, IList<string> wordDict) {
        set = new HashSet<string>(wordDict);
        return CheckWordBreak(s);
    }

    public bool CheckWordBreak(string s) {
        if (visited.ContainsKey(s)) {
            return visited[s];
        }
        if (set.Contains(s)) {
            return true;
        }
        for (int i=0; i<s.Length; i++) {
             if (set.Contains(s.Substring(0, i)) && CheckWordBreak(s.Substring(i))) {
                 visited[s] = true;
                 return true;
             }
        }
       visited[s] = false;
       return false;
    }
}