计蒜之道 初赛 第一场 搜狗输入法的分词算法

来源:互联网 发布:ai矢量制图软件 编辑:程序博客网 时间:2024/05/29 02:55

搜狗输入法最近的用户输入中出现了一种新的输入模式,形如 “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个子串,按照题中的要求直接判断其是否成立,成立则输出即可。

 

0 0