字符串匹配
来源:互联网 发布:软件测试的思路 编辑:程序博客网 时间:2024/04/26 17:26
二:一个模式匹配算法
在上课时根据老师的提示,利用函数值来判断是否做进一步做字符串内的比较。假设子串的大小为n;我一开始设了两个整型变量Sum1和Sum2,Sum1用来计算子串的字母ascii之和,Sum2用来计算n个母串字母的ascii之和,后面Sum2的改变通过迭代的思想,就是减去前面一个,加上后面一个,所以这一块的时间花费为O(n)。当Sum1!=Sum2时,说明不可能匹配,可以避免很多的重复匹配,而当Sum1==Sum2时,在进入详细的匹配。后面我通过把两个文件的内容传进去进行测试和暴力算法比较,快了一点。但后面想了一想,这个算法还是具有偶然性,时间性能和子串和母串都有关系,当母串的n个字符的Sum2值刚好都等于Sum1时,时间性能又和暴力匹配算法相同了,甚至还要慢一点,因此是不稳定的。
具体算法如下:
nt PersonalPatternMatch(String s1,String s2)
{
int State=0;
int i,Sum2=0,Sum1=0;
for(i=0;i<s2->Length;i++)
{
Sum1=Sum1+s1->Array[i];//计算 模窜的ascii码之和 ,是不变化的
Sum2=Sum2+s2->Array[i];//计算模字符串相应的ascii码之和
}
i=0;
while(i<=s1->Length-s2->Length)
{
if(Sum2!=Sum1||State)//若assic码和 不同,则主串向右移移位
{
Sum1=Sum1-s1->Array[i]+s1->Array[s2->Length+i];//移位并计算移位后主串的assci码和
State=0;
i++;
}
else//若相同,详细比较
{
int j,k=i;
for(j=0;j<s2->Length;j++)
{
if(s1->Array[k]==s2->Array[j])
{
k++;
}
else
break;
}
if(j>=s2->Length)//是否匹配 成功
return i+1;//返回匹配的主串的位置
else
State=1;
}
}
return 0;//匹配不成功
}
- 字符串匹配
- 字符串匹配
- 字符串匹配
- 字符串匹配
- 字符串匹配
- 字符串匹配
- 字符串匹配...
- 字符串匹配
- 字符串匹配
- 字符串匹配
- 字符串匹配
- 字符串匹配
- 字符串匹配
- 字符串匹配
- 字符串匹配
- 字符串匹配
- 字符串匹配
- 字符串匹配
- http接口测试资料整理系列2--http介绍
- python复习笔记[10] —— 面向对象程序设计
- 笔记——Java之抽象类
- image scale和size的关系与SDScaledImageForKey
- 设计模式学习笔记---观察者模式Observer pattern(Java版)
- 字符串匹配
- 用Criteria进行模糊查询实现简单的搜索功能
- CodeForces
- leetcode---Product of Array Except Self
- 向上转型和向下转型
- 有向图的欧拉道路 UVA
- Leetcode题解:513. Find Bottom Left Tree Value
- RHEL6.5 LVM硬盘管理
- leetcode508