給出乙個字串s和乙個詞典,判斷字串s是否可以被空格切分成乙個或多個出現在字典中的單詞。
給出s = 「lintcode」
dict = [「lint」,」code」]
返回 true 因為」lintcode」可以被空格切分成」lint code」
動態規劃。
第一種:
dp[i]表示前i個字元能否被切分。前i個字元能否被切分依賴於下面所述:
如果前i-1個字元能被切分,而且第i個字元在dict中,則dp[i]=1.
如果前i-2個字元能被切分,而且第i-1到第i個在dict中,則dp[i]=1
如果前i-3個字元能被切分,而且第i-2到第i個在dict中,則dp[i]=1
…… 如果前0個字元能被切分,而且第1到第i個在dict中,則dp[i]=1
**如下:
class
solution:
# @param s: a string s
# @param dict: a dictionary of words dict
defwordbreak
(self, s, dict):
# write your code here
n=len(s)
if len(dict)==0
and len(s)!=0:
return
false
dp=[0
for x in range(n+1)]
dp[0]=1
for i in range(1,n+1):
for j in range(1,i+1):
if dp[i-j]==1
and s[i-j:i] in dict:
dp[i]=1
break
if dp[n]==1:
return
true
else:
return
false
這樣會超時。。。
第二種:
來看**
class
solution:
# @param s: a string s
# @param dict: a dictionary of words dict
defwordbreak
(self, s, dict):
# write your code here
n=len(s)
if len(dict)==0
and len(s)!=0:
return
false
dp=[0]*(n+1)
dp[0]=1
for i in range(0,n+1):
if (not dp[i]): #如果dp[i]=0,則繼續找到dp[i]=1的位置
continue
for word in dict: #依次判斷字典中的每個單詞
length=len(word)
end=i+length
if end>n: #如果第i位置加上字典中該詞的長度超過了整個字串s的長度,肯定不能以該單詞來切分
continue
if s[i:end]==word:#沒超過長度的話,判斷i位置向後長度為length的片段和該單詞是否匹配
dp[end]=1
#注意此處不能加break,要判斷每個單詞,這樣才可以更新所有可以切分的位置
if dp[n]==1:
return
true
else:
return
false
第二種方法學習於下面
你看看別人家的孩子%>_<%
lintcode 107 單詞切分
給出乙個字串s和乙個詞典,判斷字串s是否可以被空格切分成乙個或多個出現在字典中的單詞。樣例給出 s lintcode dict lint code 返回 true 因為 lintcode 可以被空格切分成 lint code 標籤動態規劃 字串處理 思路 使用動態規劃,用一維陣列 dp i 儲存 0...
單詞搜尋 LintCode
給出乙個二維的字母板和乙個單詞,尋找字母板網格中是否存在這個單詞。單詞可以由按順序的相鄰單元的字母組成,其中相鄰單元指的是水平或者垂直方向相鄰。每個單元中的字母最多只能使用一次。樣例 給出board abce sfcs adee word abcced 返回 true,word see 返回 tru...
lintcode 最長單詞
引用塊內容 給乙個詞典,找出其中所有最長的單詞。在詞典 中,最長的單詞集合為 internationalization 在詞典 中,最長的單詞集合為 like love hate 挑戰 遍歷兩次的辦法很容易想到,如果只遍歷一次你有沒有什麼好辦法?只把最長的放在陣列中就行了 class solutio...