KMP算法 的C#实现,初级版本

static void Main(string[] args)
{
#region 随机字符
StringBuilder sb = new StringBuilder();
string S = "ABCDEFJHIJKLMNOPQRSTUVWXYZ0123456789";
Random r = new Random();
for (int f = ; f < ; f++)
{
if (f % == )
{
sb.Append("AABCDAABCD");
}
else
{
sb.Append(S.Substring(r.Next(, S.Length - ), ));
} }
string sourceStr = sb.ToString();
Console.WriteLine("待匹配的字符长度为:" + sourceStr.Length);
#endregion
Console.WriteLine("start");
Stopwatch sw = new Stopwatch();
sw.Start();
string ostr = "AABCDAABCD";//目标字符
/*
找到对应位置的最大移动长度
*/
Dictionary<int, int> dic = GetMaxMoveLength(ostr);
int success = ;
for (int i = ; i < sourceStr.Length; i++)
{
int j = ;
while (j < ostr.Length && i + j < sourceStr.Length && ostr[j] == sourceStr[i + j])
{
j++;
}
if (j == ostr.Length)
{
success++;
}
i += j;
}
sw.Stop();
Console.WriteLine("成功" + success+"个");
Console.WriteLine("时间:"+sw.ElapsedMilliseconds+"毫秒");
Console.WriteLine("End");
Console.ReadKey();
}
static Dictionary<int, int> GetMaxMoveLength(string ostr)
{
Dictionary<int, int> CanMoved = new Dictionary<int, int>();
for (int i = ; i < ostr.Length; i++)
{
List<string> q = new List<string>();
List<string> h = new List<string>();
string tempstr = ostr.Substring(, i + );
for (int j = ; j < tempstr.Length; j++)
{
q.Add(tempstr.Substring(, j));
}
for (int j = tempstr.Length - ; j > ; j--)
{
h.Add(tempstr.Substring(j, tempstr.Length - j));
}
//获取该位置的最大长度
IEnumerable<string> keys = q.Intersect(h);
int movelength = ;
foreach (string s in keys)
{
if (s.Length > movelength)
{
movelength = s.Length;
}
}
CanMoved.Add(i, i-movelength);
}
return CanMoved;
}

在42万5000个字符中匹配到25000个目标字符用时10毫秒

KMP算法 C#实现 字符串查找简单实现的更多相关文章

  1. KMP算法,匹配字符串模板(返回下标)

    //KMP算法,匹配字符串模板 void getNext(int[] next, String t) { int n = next.length; for (int i = 1, j = 0; i & ...

  2. KMP算法与传统字符串寻找算法

    原理:KMP算法是一种模板匹配算法,它首先对模板进行便利,对于模板中与模板首字符一样和首字符进行标志-1,对于模板匹配中出现不匹配的若是第一轮检查标志为0,若不是第一轮检查标志为该元素与标志为-1的距 ...

  3. 算法之暴力破解和kmp算法 判断A字符串是否包含B字符串

    我们都知道java中有封装好的方法,用来比较A字符串是否包含B字符串 如下代码,contains,用法是 str1.contains(str2), 这个布尔型返回,存在返回true,不存在返回fals ...

  4. kmp算法,求重复字符串

    public class Demo { public static void main(String[] args) { String s1 = "ADBCFHABESCACDABCDABC ...

  5. kmp算法原理与应用(简单易懂)

  6. KMP算法——字符匹配

     暴力匹配: 假设现在我们面临这样一个问题:有一个文本串S,和一个模式串P,现在要查找P在S中的位置,怎么查找呢? 如果用暴力匹配的思路,并假设现在文本串S匹配到 i 位置,模式串P匹配到 j 位置, ...

  7. 回朔法/KMP算法-查找字符串

    回朔法:在字符串查找的时候最容易想到的是暴力查找,也就是回朔法.其思路是将要寻找的串的每个字符取出,然后按顺序在源串中查找,如果找到则返回true,否则源串索引向后移动一位,再重复查找,直到找到返回t ...

  8. 字符串匹配算法之kmp算法

    kmp算法是一种效率非常高的字符串匹配算法,是由Knuth,Morris,Pratt共同提出的模式匹配算法,所以简称KMP算法 算法思想 在一个字符串中查找另一个字符串时,会遇到如下图的情况 我们通常 ...

  9. 算法-最通俗易懂的KMP算法详解

    有些算法,适合从它产生的动机,如何设计与解决问题这样正向地去介绍.但KMP算法真的不适合这样去学.最好的办法是先搞清楚它所用的数据结构是什么,再搞清楚怎么用,最后为什么的问题就会有恍然大悟的感觉.我试 ...

随机推荐

  1. 帮助新手理解equals和hashCode

    入行快要两年,偶尔想起来equals和hash还是会有些晕,索性今天就更深入的弄明白一些,不足之处也请各位大神指出批评,共同进步. 刚开始学java的时候只是记忆性的来背,如果一个类在程序中可能进行比 ...

  2. AlertDialog的实现

    课程Demo 重点解析自定义对话框 public class MainActivity extends AppCompatActivity { private Button bt1; private ...

  3. iOS Programming Localization 本地化

    iOS Programming Localization 本地化 Internationalization is making sure your native cultural informatio ...

  4. (三)Redis for StackExchange.Redis

    目录 (一)Redis for Windows正确打开方式 (二)Redis for 阿里云公网连接 (三)Redis for StackExchange.Redis StackExchange.Re ...

  5. H3C AR28-31路由器组网实验

    接线图 可以发现PC1和PC2不在一个网段上,如果不靠路由器就不可能ping,所以要用路由器组网 接线步骤 串行线连接路由器1与路由器2 以太网线连路由器以太网口 与 交换机接口 计算机网线连交换机口 ...

  6. [转]c++应用程序文件的编译过程

    原文地址 这里讲下C++文件的编译过程及其中模板的编译过程: 一:一般的C++应用程序的编译过程.    一般说来,C++应用程序的编译过程分为三个阶段.模板也是一样的. 在cpp文件中展开inclu ...

  7. date - 打印或设置系统日期和时间

    总览 date [选项]... [+格式] date [选项] [MMDDhhmm[[CC]YY][.ss]] 描述 根据指定格式显示当前时间或设置系统时间. -d, --date=STRING 显示 ...

  8. flutter 实现圆角头像的2种方法

    圆角头像在开发中应用太普遍了,我总结了2种实现方法,分享给大家 方法一: 使用Container组件的decoration可以实现 Container( width: 40, height: 40, ...

  9. Perl字符集就是方括号(或称中括号)里一连串可能的字符,只匹配单一字符,该单一字符可以是字符集里的任何一个,“-”在字符集里有特殊含义:表示某个范围的字符。而字符集意外的连字符不具有特殊意义。

    Perl字符集就是方括号(或称中括号)里一连串可能的字符,只匹配单一字符,该单一字符可以是字符集里的任何一个,“-”在字符集里有特殊含义:表示某个范围的字符.而字符集意外的连字符不具有特殊意义.

  10. xingo的demo部署

    1)安装go 2)安装git xingo默认使用google protobuf来进行序列化和反序列化操作,所以需要安装 go get  github.com/golang/protobuf/proto ...