非空の文字列を考える の と辞書 wordDict 場合、空でない単語のリストを含む、決定 sが 一個の以上の辞書の単語をスペースで区切ったシーケンスに分割することができます。
注意:
- 辞書内の同じ単語は、セグメンテーションに複数回再利用することができます。
- あなたは辞書が重複した単語が含まれていない仮定することができます。
例1:
入力:S = "leetcode"、wordDictは= [ "すご腕"、 "コード"]
出力:真の
説明: "leetcodeは" "すご腕コード"としてセグメント化することができるので、trueを返します。
例2:
入力:S = "applepenapple"、wordDictは= [ "りんご"、 "ペン"]
出力:真の
説明: "applepenapple"は"リンゴのペンりんご"としてセグメント化することができるので、trueを返します。
あなたは辞書の単語を再利用することが許可されていることに注意してください。
例3:
入力:S = "catsandog"、wordDict = [ "猫"、 "犬"、 "砂"、 "および"、 "猫"]
出力:偽
思路
問題を解決するには、私が解決するには、2つの方法を考えたときに、より興味深いものですが、二つのアプローチが交流することができません、最初の方法は、おそらく文字列sから私の最初の横行で、TEM用適用されます再TEMマッチした文字列が「」に設定されている場合、レコードの文字列に変数を横断最後の完了後に、空のTEMれるか満たしているかどうか判断され、一致しています。この欠陥は、我々は、S =「AAAAAAA」である状況を考慮することができるという考え、wordlidt =され 、[「AAAA」、「AAA」] この場合のために、彼女は常に最初ついに左につながる、「AAA」と一致します次の「A」。出力はFalse、それは正しくありません。
途中で例外的な状況では、私が横断横断するために、おそらく最初から、再帰の使用を考えて、存在する単語のリストに直面したとき、我々はsの試合を再起動し、再帰的に削除するには、引数として単語を一致させるだろう。我々は一致させることができるならば最後に、あなたは真得ることができます。しかし、この解決策うち最後の時間は、ACに失敗したため。
見た後他の人が、動的計画法を用いて解くことができるオリジナルの答えを見つけ、おそらくアイデアをFalseに初期化1秒よりも援助の長い文字列配列を、適用することで、最初の要素が真初期化されます。最後に、我々は2つのサイクルを設定し、第一副層サイクルは組み合わせリスト内の各単語の配列が存在するか否かを判断し、内側ループは、各可能なため、現在のループ横断位置の第1階層に0から表しますリスト内の文字列かどうかを判断します。最後のトラバースが完了すると、補助配列は、最後の要素の結果です。
グラフィックのアイデア
解像度コード
1 class Solution(object):
2 def wordBreak(self, s, wordDict):
3 """
4 :type s: str
5 :type wordDict: List[str]
6 :rtype: bool
7 """
8
9 if not s:
10 return True
11 dp = [False] *(len(s)+1) # 申请辅助数组
12 dp[0] = True # 第一个设置为True
13 for i in range(1, len(s)+1): # 外层循环
14 for j in range(i): # 内存循环
15 if dp[j] and s[j:i] in wordDict: # 判断条件
16 dp[i] = True
17 break
18 return dp[-1]
附上递归解法(s字符串过长时会超时)
1 class Solution(object):
2 def wordBreak(self, s, wordDict):
3 """
4 :type s: str
5 :type wordDict: List[str]
6 :rtype: bool
7 """
8
9 if not s:
10 return True
11 res= []
12 self.Bfs(s, wordDict, res) # 进行递归遍历
13 if not res:
14 return False
15 return True
16
17
18 def Bfs(self, s, wordDict, res):
19 if not s: # 如果s为空表示能够匹配,
20 res.append(True)
21 return
22 tem = ""
23 for i in range(len(s)): # 从头开始遍历
24 tem += s[i] # 记录未匹配的值
25 if tem in wordDict: # 当匹配到后,我们进行将s进行切割,
26 self.Bfs(s[i+1:], wordDict, res)