由暴力匹配算法想到

暴力匹配是最基本最直接的匹配算法,从前到后逐一匹配,若失配,则字符串右移一格,重头再来。

用SAS实现就是:

 1 %let text=abcdadbdftee;
 2 %let find=ft;
 3 data _null_;
 4     a="&text";
 5     b="&find";
 6     len_a=length(a);
 7     len_b=length(b);
 8     i=1;
 9     j=1;
10     do while (i<=len_a & j<=len_b);
11         a1=substr(a,i,1);
12         b1=substr(b,j,1);
13         if a1=b1 then do;
14             i++1;j++1;
15         end;
16         else if a1 ne b1 then do;
17             i=i-j+2;j=1;
18         end;
19     end;
20     if j>len_b then do;
21         position=i-j+1;
22         put "------POSITION:" position "---";
23     end;
24     put _all_;
25 run;

这种方法比较古老,也比较"不先进"。

鄙人利用SAS的特性,写了一个不超过10行的代码实现此功能,分享给大家:

1 %let text=abcdadbdftee;
2 %let find=ft;
3 data _null_;
4     do i=1 to %length(&text)-%length(&find)+1;
5         want=substr("&text",i,%length(&find));
6         if want="&find" then put "---POSITION:" i "---";
7     end;
8 run;

欢迎大家拍砖

by yant07

时间: 2024-12-06 16:16:27

由暴力匹配算法想到的相关文章

字符串匹配---暴力匹配算法

假设现在我们面临这样一个问题:有一个文本串S,和一个模式串P,现在要查找P在S中的位置,怎么查找呢? 首先,先理清楚了暴力匹配算法的流程及内在的逻辑: 如果用暴力匹配的思路,并假设现在文本串S匹配到 i 位置,模式串P匹配到 j 位置,则有: 如果当前字符匹配成功(即S[i] == P[j]),则i++,j++,继续匹配下一个字符: 如果失配(即S[i]! = P[j]),令i = i - (j - 1),j = 0.相当于每次匹配失败时,i 回溯,j 被置为0. 举个例子,如果给定文本串S:“

详细解读KMP模式匹配算法

转载请注明出处:http://blog.csdn.net/fightlei/article/details/52712461 首先我们需要了解什么是模式匹配? 子串定位运算又称为模式匹配(Pattern Matching)或串匹配(String Matching).在串匹配中,一般将主串称为目标串,将子串称为模式串.本篇博客统一用S表示目标串,T表示模式串,将从目标串S中查找模式串T的过程称为模式匹配. 虽然我们的主角是KMP模式匹配算法,但我们还是要先从暴力匹配算法讲起,通过发现暴力匹配算法存

特征匹配算法之误匹配的剔除

特征匹配 特征匹配是计算机视觉中经常要用到的一步.通过对图像与图像或者图像与地图之间的描述子进行准确匹配,我们可以为后续的姿态估计,优化等操作减轻大量负担.然而,由于图像特征的局部特性,误匹配的情况广泛存在.在opencv的匹配算法中 实际上集成了一些对误匹配的处理.我们首先介绍一下暴力匹配算法. 暴力匹配 cv::BFMatcher        暴力匹配是指依次查找(穷举搜索)第一组中每个描述符与第二组中哪个描述符最接近.当然初始的暴力匹配得到的误匹配很多.我们可以通过交叉匹配过滤的方法对误

从暴力匹配到KMP算法

前言 现在有两个字符串:\(s1\)和\(s2\),现在要你输出\(s2\)在\(s1\)当中每一次出现的位置,你会怎么做? 暴力匹配算法 基本思路 用两个指针分别指向当前匹配到的位置,并对当前状态进行分类讨论:若相同则继续往下匹配,否则回溯 大致思路 用\(i\)来存储\(s1\)当前匹配到的位置,用\(j\)来存储\(s2\)当前匹配到的位置,则可得初始状态下\(i=j=0\). 对于当前状态,有两种可能性: ①:\(s1[i]==s2[j]\).则\(i++,j++\) ②:\(s1[i]

字符串的模式匹配中的算法

字符串的模式匹配是一个比较经典的问题:假设有一个字符串S,称其为主串,然后还有一个字符串T,称其为子串. 现在要做的是,从主串S当中查找子串T的位置,如果存在返回位置值,如果不存在返回-1.另外主串又称为目标串, 子串称为模式串. 暴力匹配算法 这是一个经典的串匹配问题,涉及的算法也比较多,先讨论第一种简单的暴力算法,思路如下 将主串S的第pos个字符 与 子串T的第一个字符比较, 若相同,继续比较子串和主串后面的字符. 若不相同,那么从主串S的第(pos + 1)个字符开始继续向后匹配,直到匹

从头到尾彻底理解KMP

从头到尾彻底理解KMP 本文转自:http://blog.csdn.net/v_july_v/article/details/7041827 作者:July时间:最初写于2011年12月,2014年7月21日晚10点 全部删除重写成此文,随后的半个多月不断反复改进.后收录于新书<编程之法:面试和算法心得>第4.4节中. 1. 引言 本KMP原文最初写于2年多前的2011年12月,因当时初次接触KMP,思路混乱导致写也写得混乱.所以一直想找机会重新写下KMP,但苦于一直以来对KMP的理解始终不够

字符串匹配的python实现

所有字符串匹配算法的核心问题是,当出现不匹配时,如何向后移动模式串 一.暴力匹配算法 如果要匹配一个字符串s 和一个模式串p,则从i=0开始依次匹配s[i:(i+len(p))],简单粗暴,代码如下: def matcher(t, p): # param t: the string to check # param p: pattern n = len(t) m = len(p) for i in xrange(0, n-m+1): if p == t[i:i+m]: return True 二

Kmp算法笔记

Kmp算法我是看July博客学习,这里只是做个笔记,详细内容见July的blog: http://blog.csdn.net/v_july_v/article/details/7041827 Kmp算法的用途:有一个文本串S和一个模式串P,现在要查找P在S中的位置.暴力匹配算法需要对文本串S进行回溯,kmp算法就是让文本串不回退,只需要移动模式串j即可. Kmp算法大体思想:就是当s[i]==p[j]时,我们对i++,j++:如果不相等则令j=next[j].这里next[j]为j字符之前的字符

从头到尾彻底理解KMP(2014年8月22日版)

从头到尾彻底理解KMP 作者:July 时间:最初写于2011年12月,2014年7月21日晚10点 全部删除重写成此文,随后的半个多月不断反复改进. 1. 引言 本KMP原文最初写于2年多前的2011年12月,因当时初次接触KMP,思路混乱导致写也写得混乱.所以一直想找机会重新写下KMP,但苦于一直以来对KMP的理解始终不够,故才迟迟没有修改本文. 然近期因在北京开了个算法班,专门讲解数据结构.面试.算法,才再次仔细回顾了这个KMP,在综合了一些网友的理解.以及跟我一起讲算法的两位讲师朋友曹博