LeetCode:139. Word Break(單詞劃分)
阿新 • • 發佈:2018-12-21
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)