使用动态规划的方法。我们可以创建一个布尔数组 dp
,其中 dp[i]
表示字符串 s
的前 i
个字符(不包括i
)是否可以由字典中的单词拼接而成。以下是具体的实现步骤:
- 初始化:创建一个与
s
长度 + 1 大小的布尔数组dp
,dp[0]
设置为true
(表示空字符串可以被拼接)。 - 填充数组:对于
i
从 1 到s.length()
,检查所有可能的j
,如果dp[j]
为true
,并且s[j:i]
在字典中,说明dp[i]
也应该是true
。 - 返回结果:最终返回
dp[s.length()]
,如果为true
,则可以拼接出s
。
def wordBreak(s, wordDict):
word_set = set(wordDict) # 使用集合进行快速查找
dp = [False] * (len(s) + 1)
dp[0] = True # 空字符串可以被拼接
for i in range(1, len(s) + 1):
for j in range(i):
if dp[j] and s[j:i] in word_set:
dp[i] = True
break # 一旦找到可以拼接的方案,跳出循环
return dp[len(s)] # 查看整个字符串是否可以被拼接
# 示例
print(wordBreak("leetcode", ["leet", "code"])) # 输出: True
print(wordBreak("applepenapple", ["apple", "pen"])) # 输出: True
print(wordBreak("catsandog", ["cats", "dog", "sand", "and", "cat"])) # 输出: False
c++
class Solution {
public:
bool wordBreak(string s, vector<string>& wordDict) {
int n = s.size();
bool f[310];
f[0] = true;
for( int i=1; i<=n; i++ )
for( int j=0; j<i; j++ )
{
string sub = s.substr(j,i-j);
if( f[j] && check(wordDict,sub) ) // 这段是关键;
{
f[i] = true;
break;
}
}
return f[n];
}
bool check(vector<string> wordDict,string s)
{
for( int i=0; i<wordDict.size(); i++ )
{
if( wordDict[i] == s ) return true;
}
return false;
}
};