LintCode 單詞切分

2021-08-03 12:33:04 字數 1869 閱讀 9392

給出乙個字串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...