1. 程式人生 > >LeetCode:139. Word Break(單詞劃分)

LeetCode:139. Word Break(單詞劃分)

Given a non-empty string s and a dictionary wordDict containing a list of non-empty words, determine if scan 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.

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

方法1:(動態規劃)

import org.junit.Test;

import java.util.ArrayList;
import java.util.List;

/**
 * @author zhangyu
 * @version V1.0
 * @ClassName: WrodBreak
 * @Description: TOTO
 * @date 2018/12/13 13:53
 **/


public class WordBreak {
    @Test
    public void fun() {
        String s = "applepenapple";
        List<String> wordDict = new ArrayList<>();
        wordDict.add("apple");
        wordDict.add("pen");
        boolean flag = wordBreak2(s, wordDict);
        System.out.println(flag);
    }

    // 這個有問題
    /*private boolean wordBreak(String s, List<String> wordDict) {
        for (String word : wordDict) {
            if (s.contains(word)) {
                // int index = s.indexOf(word);
                //  s = s.substring(index, index + word.length());
                s = s.replaceFirst(word, "");
            }
        }
        if (s.equals("") || wordDict.contains(s)) {
            return true;
        }
        return false;
    }*/

    private boolean wordBreak2(String s, List<String> wordDict) {
        boolean[] f = new boolean[s.length() + 1];
        f[0] = true;
        for (int i = 1; i <= s.length(); i++) {
            for (int j = 0; j < i; j++) {
                if (f[j] && wordDict.contains(s.substring(j, i))) {
                    f[i] = true;
                    break;
                }
            }
        }
        return f[s.length()];
    }
}

時間複雜度:O(n^2)

空間複雜度:O(n)