From 78deeba390262e452539e6212760cce7ccc3b3fe Mon Sep 17 00:00:00 2001 From: rossy0213 Date: Fri, 24 May 2024 01:20:10 +0900 Subject: [PATCH] add: Word Break --- WordBreak/step1.md | 33 +++++++++++++++++ WordBreak/step2.md | 29 +++++++++++++++ WordBreak/step3.md | 89 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 151 insertions(+) create mode 100644 WordBreak/step1.md create mode 100644 WordBreak/step2.md create mode 100644 WordBreak/step3.md diff --git a/WordBreak/step1.md b/WordBreak/step1.md new file mode 100644 index 0000000..a1c7ccb --- /dev/null +++ b/WordBreak/step1.md @@ -0,0 +1,33 @@ +```java +// DP +// Create a boolean array with same length of given s +// Then foreach index of the DP, check if can we reach it +// Time complexity: O(N * M) -> N: length of given s, M: Number of unique lengths of the given word +// Space complexity: O(N + M + O) O: number of unique given word +// Time spend: 14:30 +class Solution { + public boolean wordBreak(String s, List wordDict) { + Set wordSet = new HashSet<>(); + Set wordLengthSet = new HashSet<>(); + for (String word : wordDict) { + wordSet.add(word); + wordLengthSet.add(word.length()); + } + + boolean[] dp = new boolean[s.length() + 1]; + dp[0] = true; + + for (int i = 0; i < dp.lenght; i++) { + for (Integer wordLength : wordLengthSet) { + int previousIndex = i - wordLength; + if (previousIndex >= 0 && dp[previousIndex] && wordSet.contains(s.substring(previousIndex, i))) { + dp[i] = true; + break; + } + } + } + + return dp[s.length()]; + } +} +``` \ No newline at end of file diff --git a/WordBreak/step2.md b/WordBreak/step2.md new file mode 100644 index 0000000..16b4830 --- /dev/null +++ b/WordBreak/step2.md @@ -0,0 +1,29 @@ +```java +// Time spend: 05:39 +class Solution { + public boolean wordBreak(String s, List wordDict) { + Set wordSet = new HashSet<>(); + Set wordLengthSet = new HashSet<>(); + + for (String word : wordDict) { + wordSet.add(word); + wordLengthSet.add(word.length()); + } + + var dp = new boolean[s.length() + 1]; + dp[0] = true; + + for (int i = 1; i <= s.length(); i++) { + for (int wordLength : wordLengthSet) { + var previousIndex = i - wordLength; + if (previousIndex >= 0 && dp[previousIndex] && wordSet.contains(s.substring(previousIndex, i))) { + dp[i] = true; + break; + } + } + } + + return dp[s.length()]; + } +} +``` \ No newline at end of file diff --git a/WordBreak/step3.md b/WordBreak/step3.md new file mode 100644 index 0000000..98ef991 --- /dev/null +++ b/WordBreak/step3.md @@ -0,0 +1,89 @@ +```java +// Time spend: 03:59 +class Solution { + public boolean wordBreak(String s, List wordDict) { + Set wordSet = new HashSet<>(); + Set wordLengthSet = new HashSet<>(); + for (String word : wordDict) { + wordSet.add(word); + wordLengthSet.add(word.length()); + } + + int l = s.length(); + var dp = new boolean[l + 1]; + dp[0] = true; + for (int i = 1; i <= l; i++) { + for (int length : wordLengthSet) { + var previousIndex = i - length; + if (previousIndex >= 0 && dp[previousIndex] && wordSet.contains(s.substring(previousIndex, i))) { + dp[i] = true; + break; + } + } + } + + return dp[l]; + } +} +``` + +```java +// Time spend: 02:59 +class Solution { + public boolean wordBreak(String s, List wordDict) { + Set wordSet = new HashSet<>(); + Set wordLengthSet = new HashSet<>(); + for (String word : wordDict) { + wordSet.add(word); + wordLengthSet.add(word.length()); + } + + int l = s.length(); + var dp = new boolean[l + 1]; + dp[0] = true; + for (int i = 1; i <= l; i++) { + for (int length : wordLengthSet) { + var previousIndex = i - length; + if (previousIndex >= 0 && dp[previousIndex] && wordSet.contains(s.substring(previousIndex, i))) { + dp[i] = true; + break; + } + } + } + + return dp[l]; + } +} +``` + +```java +// Time spend: 02:40 +class Solution { + public boolean wordBreak(String s, List wordDict) { + Set wordSet = new HashSet<>(); + Set wordLengthSet = new HashSet<>(); + for (String word : wordDict) { + wordSet.add(word); + wordLengthSet.add(word.length()); + } + + int l = s.length(); + boolean[] dp = new boolean[l + 1]; + dp[0] = true; + for (int i = 1; i <= l; i++) { + for (int length : wordLengthSet) { + int previousIndex = i - length; + if (previousIndex < 0 || !dp[previousIndex]) { + continue; + } + if (wordSet.contains(s.substring(previousIndex, i))) { + dp[i] = true; + break; + } + } + } + + return dp[l]; + } +} +``` \ No newline at end of file