哦,不!你不小心把乙個長篇文章中的空格、標點都刪掉了,並且大寫也弄成了小寫。像句子"i reset the computer. it still didn』t boot!「已經變成了"iresetthecomputeritstilldidntboot」。在處理標點符號和大小寫之前,你得先把它斷成詞語。當然了,你有一本厚厚的詞典dictionary,不過,有些詞沒在詞典裡。假設文章用sentence表示,設計乙個演算法,把文章斷開,要求未識別的字元最少,返回未識別的字元數。
注意:本題相對原題稍作改動,只需返回未識別的字元數
使用dp[i]表示前i個字元中沒匹配的最小字元數,可以想到從j位置到i位置的字元如果存在字典裡面,那麼dp[i] = min(dp[i], dp[j]),否則就是dp[i] = dp[i-1] + 1。問題就轉化成快速判斷當前字串是否在字典裡面,可以使用字典樹進行輔助查詢。
class
trie
;bool isend =
false
;trie()
void
insert
(string word)
tmp = tmp -
> children[pos];}
tmp -
> isend =
true;}
};class
solution
vector<
int>
dp(n +
1, inf)
; dp[0]
=0;for
(int i =
1; i <= n; i++)if
(tmp -
> children[pos]
-> isend ==
true
) tmp = tmp -
> children[pos];}
}return dp[n];}
};
面試題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 在處理標點符號和大小寫之前,你得先把它斷成...