哦,不!你不小心把乙個長篇文章中的空格、標點都刪掉了,並且大寫也弄成了小寫。像句子"i reset the computer. it still didn』t boot!"
已經變成了"iresetthecomputeritstilldidntboot"
。在處理標點符號和大小寫之前,你得先把它斷成詞語。當然了,你有一本厚厚的詞典dictionary
,不過,有些詞沒在詞典裡。假設文章用sentence
表示,設計乙個演算法,把文章斷開,要求未識別的字元最少,返回未識別的字元數。
**注意:**本題相對原題稍作改動,只需返回未識別的字元數
示例:
輸入:
dictionary = ["looked","just","like","her","brother"]
sentence = "jesslookedjustliketimherbrother"
輸出: 7
解釋: 斷句後為"jess looked just like tim her brother",共7個未識別字元。
思路:動態規劃:令dp[i]
表示前i個字元中未能識別的最少字元個數,我們從第i個字元開始向查詢字串是否存在dectionary
中
不存在:dp[i] = min(dp[i-1]+1,dp[i])
存在:dp[i] = min(dp[i], dp[i-len])
比較查詢字串的過程可以用優化:
比如存在字典 :mimy, why
,當我們從後往前找到ty
時就不必再往前找了,因為字典中沒有以ty
結尾的詞,該思路可以用字典樹是實現
不過增加了空間複雜度
public
intrespace
(string[
] dictionary, string sentence)
int[
] dp =
newint
[n +1]
; arrays.
fill
(dp, integer.max_value)
; dp[0]
=0;for
(int i =
1; i <= n;
++i)
else
if(curpos.next[t]
.isend)
if(dp[i]==0
) curpos = curpos.next[t];}
}return dp[n];}
}class
trie
public
void
insert
(string s)
curpos = curpos.next[t];}
curpos.isend =
true
;}
面試題17 13 恢復空格
刷題主頁 一看就是給定字串和字典,檢視是否匹配類的問題,因此直接考慮動態規劃,dp i 表示前i個字元未識別的字元最少數,那麼當s j 1 i 在字典中時,dp i min dp i dp j 1 否則dp i dp i 1 1 整體和單詞拆分類似,雙重迴圈 判斷即可。class solution ...
面試題 17 13 恢復空格
哦,不!你不小心把乙個長篇文章中的空格 標點都刪掉了,並且大寫也弄成了小寫。像句子 i reset the computer.it still didn t boot 已經變成了 iresetthecomputeritstilldidntboot 在處理標點符號和大小寫之前,你得先把它斷成詞語。當然...
面試題 17 13 恢復空格
題目描述 哦,不!你不小心把乙個長篇文章中的空格 標點都刪掉了,並且大寫也弄成了小寫。像句子 i reset the computer.it still didn t boot 已經變成了 iresetthecomputeritstilldidntboot 在處理標點符號和大小寫之前,你得先把它斷成...