識別字串 是 lintcode(詳見 lintcode介紹)所提供的一道 簡單 級別的面試題,現在我對python3的實現做以簡單分析,如有不妥之處,歡迎指正。
給定一組n個僅包含小寫字母的字串,為每個字串找出能夠唯一識別該字串的最小字首
即可以識別a串的最小字首ap,不會是其他n-1個字串的字首。
1 <= n <= 500;
字串長度不超過100;
如果乙個字串s是另乙個字串t的字首,則s的最小可識別字首為s。
看完題目描述有沒有感覺比較繞?看個樣例就可以了:
輸入:[「aaa」,「bbc」,「bcd」]
輸出:[「a」,「bb」,「bc」]
解釋:「a"僅是"aaa」 的字首;
"bb"僅是"bbc"的字首;
"bc"僅是"bcd"的字首;
即我們需要的是找到屬於每個字串所特有的最短字首,要求該字首不會在其他字串中重複出現,如樣例中所給出的"bbb" 以及"bcd":由於"b"在兩者中均出現,所以不能直接取"b"作為符合要求的最短字首。繼續往後讀,前者讀到"bb"而後者讀到"bc"出現不同字首(即獨有字首)便可以作為符合要求的字首,輸出即可。
class
solution
:def
shortperfix
(self, stringarray):if
not stringarray:
return
prefix =
for string in stringarray:
for idx in
range
(len
(string)):
prefix[string[
:idx +1]
]= prefix.get(string[
:idx +1]
,0)+
1 res =
for string in stringarray:
for idx in
range
(len
(string)):
if prefix[string[
:idx +1]
]==1:
:idx +1]
)break
if idx ==
len(string)-1
:return res
第一行定義類solution(解決方案)這是lintcode所要求的部分,只是為了順利進行**測試,不必要過多闡述。
主要功能在於函式shortperfix,其帶有乙個引數stringarray(self是作為有class前提的必要引數,之後**並沒有呼叫,所以這裡不再講解)。引數stringarray 是乙個輸入的字串陣列,也就是我們將進行字首識別的字串陣列。
函式首先執行了乙個簡單判斷句 if not stringarray 考慮了空字串的情況,若輸入空,則返回空。隨後定義乙個perfix來儲存可能得到的字首長度。string[:idx + 1] 表示擷取字串string從起始位置到索引為 idx + 1 位置的字串。
接下來,利用for迴圈遍歷輸入陣列中所有字串,然後根據每個字串的長度(len(string))獲取其可能存在的最短字首長度。
下一步進行字首判斷,使用了2個if來判斷不同情況,第乙個:若所得字首在idx + 1處長度為1,則將此字首加入res(即最終輸出的陣列)中。第二個:若此時索引值為字串長度減一(即字首為整個字串),則直接把字串加入res中。
最終輸出所得 res 結果。
在剛才的分析中,細心的朋友們就會發現,在整個程式中執行了兩次字串陣列遍歷,且把獲取字首和判斷字首分成了兩部分,這樣的寫法確實通俗易懂,但使得程式執行的時間達不到最快(lintcode上該**測試平均耗時 302 ms ,這已經很快了)。
以下是乙個極好的解決方案(僅 201 ms):
class
solution
:def
shortperfix
(self, stringarray)
:from collections import defaultdict
trie =
lambda
: defaultdict(trie)
root = trie(
)for string in stringarray:
p = root
for c in string:
p = p[c]
if'#'
notin p:
p['#']=0
p['#']+=1
p['$']
=true
ans =
for string in stringarray:
p = root
cur =
""for c in string:
p = p[c]
cur += c
if p[
'#']==1
:break
else
:return ans
這個寫法就很高階,高階到我看不懂,它好像是直接在collections中引入一種預設類例項化然後進行一頓十分高階的操作就完成了判斷,這段**真的看得頭暈眼乏,希望有大佬講解一下。 字元識別(字串處理)
描述 中南林業科技大學計算機與資訊工程學院某位老師開發乙個字元識別程式.這個程式用來將紙質文件轉換為電子版.很顯然,這個轉換過程不能保證100 正確,其中有些字元不能識別.你的任務是寫乙個程式幫助這位老師計算識別的效率.識別的效率用公式r a進行計算,其中r表示被成功識別的字元總數,a表示識別的字元...
資料逆向(三) 識別字串與陣列
字串 在c語言中,字串是由字元組成,單字元不是字串,至少有兩個字元組成,且結尾字元是 0 例如 abcd 記憶體中實際儲存結構是 41h 42h 43h 44h 00h 字串的定址,依靠首位元組進行暫存器相對定址方式 例如 訪問 abcd 中的第二位元組,byte ptr ebx 1 正是因為字串的...
車牌識別字元模板庫
車牌識別字元模板庫 你好!這是你第一次使用markdown編輯器所展示的歡迎頁。如果你想學習如何使用markdown編輯器,可以仔細閱讀這篇文章,了解一下markdown的基本語法知識。全新的介面設計,將會帶來全新的寫作體驗 在創作中心設定你喜愛的 高亮樣式,markdown將 片顯示選擇的高亮樣式...