# 139. Word Break

### Description

Given a **non-empty** string *s* and a dictionary *wordDict* containing a list of **non-empty** words, determine if *s* can be segmented into a space-separated sequence of one or more dictionary words.

**Note:**

* The same word in the dictionary may be reused multiple times in the segmentation.
* You may assume the dictionary does not contain duplicate words.

### Constraints

### Approach

### Links

* GeeksforGeeks
* [Leetcode](https://leetcode.com/problems/word-break/)
* [ProgramCreek](https://www.programcreek.com/2012/12/leetcode-solution-word-break/)
* YouTube

### **Examples**

{% tabs %}
{% tab title="Example 1" %}
**Input:** s = "leetcode", wordDict = \["leet", "code"]

**Output:** true

**Explanation:** Return true because "leetcode" can be segmented as "leet code".
{% endtab %}

{% tab title="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.
{% endtab %}

{% tab title="Example 3" %}
**Input:** s = "catsandog", wordDict = \["cats", "dog", "sand", "and", "cat"]

**Output:** false
{% endtab %}
{% endtabs %}

### **Solutions**

{% tabs %}
{% tab title="Solution 1" %}

```java
/**
 * Time complexity : 
 * Space complexity : 
 */

class Solution {
    public boolean wordBreak(String s, List<String> wordDict) {
        int sLen = s.length();
        
        int[] pos = new int[sLen+1];
        Arrays.fill(pos, -1);
        pos[0] = 0;

        for(int i = 0; i < sLen; i++) {
            if(pos[i] != -1) {
                for(int j = i+1; j <= sLen; j++) {
                    String str = s.substring(i, j);
                    if(wordDict.contains(str)) {
                        pos[j] = i;
                    }
                }
            }
        }

        return pos[sLen] != -1;
    }
}
```

{% endtab %}

{% tab title="Solution 2" %}

```java
/**
 * Time complexity : 
 * Space complexity : 
 */

class Solution {
    public boolean wordBreak(String s, List<String> wordDict) {
        if(s.length() > 100) return false;
        for(String word: wordDict) {
            if(s.startsWith(word) && 
               (s.equals(word) || 
                   wordBreak(s.substring(word.length()), wordDict))) {
                return true;
            }
        }
        return false;
    }
}
```

{% endtab %}
{% endtabs %}

### **Follow up**

*
