Daily 25/05/2024: [140. Word Break II](https://leetcode.com/problems/word-break-ii/)
# 1. Tóm tắt đề bài
Cho một chuỗi ```s``` và một từ điển gồm các chuỗi ```wordDict```, hãy thêm dấu cách vào ```s``` để xây dựng một câu trong đó mỗi từ là một từ hợp lệ trong từ điển. Trả lại tất cả các câu có thể có theo thứ tự bất kỳ .
Lưu ý rằng cùng một từ trong từ điển có thể được sử dụng lại nhiều lần trong quá trình phân đoạn.
#### Giới hạn
- $1 \le$ ```s.length``` $\le 20$
- $1 \le$ ```wordDict.length``` $\le 1000$
- $1 \le$ ```wordDict[i].length``` $\le 10$
- ```s``` và ```wordDict[i]``` chỉ bao gồm các chữ cái tiếng Anh viết thường.
- Tất cả các chuỗi ```wordDict``` không trùng nhau.
- Dữ liệu đầu vào được tạo theo cách sao cho độ dài của câu trả lời không vượt quá $10^5$
# 2. Tóm tắt lời giải
#### Phân tích
- Bài này thực tế để mọi người có thể rèn luyện đệ quy backtrack.
- Thật vậy, chúng ta sẽ xét một chuỗi ```s```, chẳng hạn và xét từng vị trí của nó rồi kiểm tra xem ```s[0->i]``` có phải từ trong từ điển không rồi tính bài toán con với chuỗi ```s[i+1 -> end]```.
# 3. Lời giải chi tiết
#### Thuật toán
- Từ phân tích thì kết quả là chúng ta có công thức đệ quy sau.
- Chúng ta có hàm đệ quy ```slice```, với tham số là chuỗi cần xử lý ```s```.
- Trường hợp cơ sở là s đã được giải quyết hoặc s rỗng.
- res là mảng chưa đáp án của s.
- Xét từng ```s[0->i]```. Nếu ```s[0->i]``` trong từ điển thì chúng ta chỉ cần thêm vào res chuỗi ```s[0->i] + " " +``` từng thằng trong mảng kết quả của bài toán con với ```s[i+1->end]```.
- Để kiểm tra ```s``` đã được giải quyết chưa tránh lặp lại thêm bước đệ quy thì dùng ```map C++``` hay ```dict python``` và các cấu trúc tương tự ở ngôn ngữ khác.
#### Code
```python
class Solution:
def wordBreak(self, s: str, wordDict: List[str]) -> List[str]:
n: ỉnt = len(s)
word_set = set(wordDict)
m = {}
def slice(s: str):
if s in m: return m[s]
if not s: return []
res = []
for i in range(1, len(s) + 1):
if s[:i] in word_set:
right = slice(s[i:])
if right:
for x in right:
res.append(s[:i] + " " + x)
elif not s[i:]:
res.append(s[:i])
m[s] = res
return res
return slice(s)
```
#### Độ phức tạp
$O(2^n)$.
# 4. Kết luận & gợi ý mở rộng
- Một bài cuối tuần nhẹ nhàng.
> Hãy dùng nghị lực và sự kiên trì để đánh bại mọi thứ.
###### #Hashtag: <span style='color: blue'>Binary Tree, Depth First Search</span>