把模式与文本位置联系起来

精确子串搜索给定文本和模式,判断模式的全部字符能否连续出现在文本某处,并返回相应起点。简单方法把模式依次对齐每个可能位置,从头比较;发现失配就换一个起点。

接口还须决定寻找第一处还是全部出现,是否允许重叠,以及空模式怎样处理。比如在aaaa中查找aa,允许重叠时可报告三个起点,只保留不相交匹配则有不同结果;算法名字本身不会替应用选择这项约定。

参考:[1]

减少失配之后的重复工作

长度m的模式在长度n的文本上逐处重试,最坏可能反复比较同一批字符,达到O(nm)工作。KMP利用模式内部的前后缀关系保留已知信息;Boyer–Moore从另一方向比较并计算安全移动距离;Rabin–Karp则先比较可滚动更新的指纹。

这些方法优化的准备对象不同:可以先处理模式,在多个文本上复用,或先为固定文本建立后缀索引,服务许多模式查询。预处理与单次搜索的成本应分开,不能只比较最短的一段扫描循环。

参考:[1] [2] [3] [4] [5]

字符命中不等于对象身份已经确定

“相同字符”也依赖表示:字节、Unicode码点与近似用户感知字符的字素簇不是同一种单位。大小写、规范化和词边界若有特殊要求,应先定义转换与边界规则,并保留从处理后位置回到原文位置的对应。

精确搜到一个常见词,只能证明这段字符出现,不能单独证明它指某个同名人物、软件或机构。需要消歧时,还须结合上下文和主体信息;如果另允许编辑距离内的近似出现,那又增加了独立的容错匹配条件。

参考:[1] [6] [7] [8]