1. 程式人生 > >計蒜之道 初賽 第一場 搜狗輸入法的分詞演算法

計蒜之道 初賽 第一場 搜狗輸入法的分詞演算法

搜狗輸入法最近的使用者輸入中出現了一種新的輸入模式,形如 “0k1234567”,搜狗的工程師發現這一模式後瞭解到,這是一種新被提出的對於十五進位制數字的標記模式,其中 “0k” 是標記進製為15的字首標記,之後的部分 “1234567” 是實際的十五進位制的數字串。

在發現這一標記模式後,搜狗的工程師開始嘗試在已有的分詞演算法上進一步加入對於十五進位制數字串的處理,把網頁上的這種形式的 15 進位制數正確地提取出來。我們知道,標記十五進位制的 “0k” 中 k 必須是小寫,數字 0 到 14 在這套標記模式下會被依次表示為:0k0, 0k1, ..., 0k9, 0kA, 0kB, 0kC, 0kD, 0kE。也就是說 15 進位制數字中只會出現 0-9、k 和 A-E。值得注意的是,數字表示中不能有多餘的 0,比如 0k05 是不能被當做一個十五進位制數字的。另外,作為一種約定,當出現 “0k90k8” 時,只有 0k90 是符合期望的十五進位制數字,即總是從左至右依次提取出最長的十五進位制數字。如果希望表達 0k9 和 0k8 這兩個數字的連寫情況時,則會被寫成 “0k9'0k8” 這一的形式。

搜狗的工程師希望將使用者輸入中符合上述要求的所有十五進位制數依次輸出。你能幫他實現麼?輸入一行字串 str (1 ≤ |str| ≤ 10^6),表示搜狗工程師得到的使用者輸入。使用者輸入中的字元一定是數字 (0 - 9) 或大小寫英文字母 (a - z, A - Z)。輸出包括若干行,每行輸出一個提取出的十五進位制數(形式如同:0k1234),分別對應輸入字串中含有的若干個符合標記模式的十五進位制數字;輸出時,請以數字在原字串中的順序依次輸出。樣例1

輸入:sjfjfhua0kA0000lmNhdhahdfhGgdJG90K10k110k120kF

輸出:

0kA0000

0k110

解決思路:

首先找出所有0k,並記錄他們在字串中的位置,假設得出的0k數量為n,自此字串可分成n個子串

對於前n-1個0k子串,判斷各個子串是否滿足條件,注意:判斷第i個子串的結尾時,需考慮第i+1個子串是否滿足成立條件,不滿足則需將第i+1個子串的'0k'中的‘0’新增到第i個子串結尾。

對於第n個子串,按照題中的要求直接判斷其是否成立,成立則輸出即可。