使用C# 优化KMP字符串匹配算法
2011-10-14 00:48
579 查看
字符串匹配在现实生活中有着广泛的应用,DNA匹配,情报检索,信息查找等.在字符串匹配算法中BM 算法,经过事实验证是最高效算法.不过它也是最抽象的算法.由于本人水平有限,只能写一些KMP的优化,希望大家海涵.具体示例代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
public class KMPMatchString
{
/// <summary>
/// 优化的KMP字符串匹配算法
/// </summary>
/// <param name="pad">要匹配的字符串</param>
/// <param name="patd">目标字符串</param>
/// <param name="present">返回匹配成功百分率</param>
/// <returns> 返回一个目标字符串的索引 -1 表示失败</returns>
static int YouHua_KMP(string pad, string patd, ref double present)
{
present = 0.0;
pad = pad.Trim();
char[] C_pad = pad.ToCharArray();
char[] C_patd = patd.ToCharArray();
//分别得到匹配字符串的长度
int a = patd.Length;
int b = pad.Length;
if (patd.Contains(pad))
{
int offset = 0;
int sum = 0; //匹配计数
int limit = 0; //界限
int i = 0; //控制C-pad的数组下标
int j = 0; //控制C_patd的数组下标
int s = 0; //控制C-pad开始搜索的起始索引
do
{ //匹配上
if (C_pad[i] == C_patd[j])
{
i++;
j++;
sum++;
limit++;
}
else
{
j++;
i = 0;
}
offset++;
if (i == b)
{
s = offset - b;
break;
}
} while (true);
if (i == b)
{
present = i * 100 / sum;
}
return s;
}
else
{
return -1;
}
}
/// <summary>
/// 优化的KMP字符串匹配算法
/// </summary>
/// <param name="pad">要匹配的字符串</param>
/// <param name="patd">目标字符串</param>
/// <returns> 返回一个目标字符串的索引 -1 表示失败</returns>
static int YouHua_KMP(string pad, string patd)
{
pad = pad.Trim();
char[] C_pad = pad.ToCharArray();
char[] C_patd = patd.ToCharArray();
//分别得到匹配字符串的长度
int a = patd.Length;
int b = pad.Length;
if (patd.Contains(pad))
{
int offset = 0;
int sum = 0; //匹配计数
int limit = 0; //界限
int i = 0; //控制C-pad的数组下标
int j = 0; //控制C_patd的数组下标
int s = 0; //控制C-pad开始搜索的起始索引
do
{ //匹配上
if (C_pad[i] == C_patd[j])
{
i++;
j++;
sum++;
limit++;
}
else
{
j++;
i = 0;
}
offset++;
if (i == b)
{
s = offset - b;
break;
}
} while (true);
return s;
}
else
{
return -1;
}
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
public class KMPMatchString
{
/// <summary>
/// 优化的KMP字符串匹配算法
/// </summary>
/// <param name="pad">要匹配的字符串</param>
/// <param name="patd">目标字符串</param>
/// <param name="present">返回匹配成功百分率</param>
/// <returns> 返回一个目标字符串的索引 -1 表示失败</returns>
static int YouHua_KMP(string pad, string patd, ref double present)
{
present = 0.0;
pad = pad.Trim();
char[] C_pad = pad.ToCharArray();
char[] C_patd = patd.ToCharArray();
//分别得到匹配字符串的长度
int a = patd.Length;
int b = pad.Length;
if (patd.Contains(pad))
{
int offset = 0;
int sum = 0; //匹配计数
int limit = 0; //界限
int i = 0; //控制C-pad的数组下标
int j = 0; //控制C_patd的数组下标
int s = 0; //控制C-pad开始搜索的起始索引
do
{ //匹配上
if (C_pad[i] == C_patd[j])
{
i++;
j++;
sum++;
limit++;
}
else
{
j++;
i = 0;
}
offset++;
if (i == b)
{
s = offset - b;
break;
}
} while (true);
if (i == b)
{
present = i * 100 / sum;
}
return s;
}
else
{
return -1;
}
}
/// <summary>
/// 优化的KMP字符串匹配算法
/// </summary>
/// <param name="pad">要匹配的字符串</param>
/// <param name="patd">目标字符串</param>
/// <returns> 返回一个目标字符串的索引 -1 表示失败</returns>
static int YouHua_KMP(string pad, string patd)
{
pad = pad.Trim();
char[] C_pad = pad.ToCharArray();
char[] C_patd = patd.ToCharArray();
//分别得到匹配字符串的长度
int a = patd.Length;
int b = pad.Length;
if (patd.Contains(pad))
{
int offset = 0;
int sum = 0; //匹配计数
int limit = 0; //界限
int i = 0; //控制C-pad的数组下标
int j = 0; //控制C_patd的数组下标
int s = 0; //控制C-pad开始搜索的起始索引
do
{ //匹配上
if (C_pad[i] == C_patd[j])
{
i++;
j++;
sum++;
limit++;
}
else
{
j++;
i = 0;
}
offset++;
if (i == b)
{
s = offset - b;
break;
}
} while (true);
return s;
}
else
{
return -1;
}
}
}
}
相关文章推荐
- 使用C# 优化KMP字符串匹配算法
- C# 使用LINQ、泛型、Index函数优化switch(或者多条if)语句
- luyikk Monster raid 一款使用C# 写的SYN 利器,完全代码共享,希望各位高手协助优化.
- C#与.NET程序员面试宝典 2.2.2 面试题9:如何使用实时编译进行代码优化
- [ASP.NET2.0]Repeater C# 分页用法的效率及简单优化(不使用存储过程)
- C#使用Linq优化查询速度
- 使用MPGO和NGEN来优化C#桌面程序的启动性能
- C#编译器优化那点事 c# 如果一个对象的值为null,那么它调用扩展方法时为甚么不报错 webAPI 控制器(Controller)太多怎么办? .NET MVC项目设置包含Areas中的页面为默认启动页 (五)Net Core使用静态文件 学习ASP.NET Core Razor 编程系列八——并发处理
- C#中尾递归的使用、优化及编译器优化
- C# ASP.NET 优化程序性能、降低内存使用、提高程序运行速度
- C# 数据库连接池 的使用 可以优化数据库
- luyikk Monster raid 一款使用C# 写的SYN 利器,完全代码共享,希望各位高手协助 优化.
- 在Winform中使用C#异步优化耗时操作
- C# 使用LINQ、泛型、Index函数优化switch(或者多条if)语句
- C#中HashTable的使用
- [C#]在WinForm下使用HttpWebRequest上传文件并显示进度
- 图形图像处理-之-高质量的快速的图像缩放 补充 使用SSE2优化
- C#【控件使用】复选框
- C#类库编译及使用
- (转) C#中Timer使用及解决重入(多线程同时调用callback函数)问题