字符串匹配

来源:互联网 发布:软件测试的思路 编辑:程序博客网 时间: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;//匹配不成功    

}



0 0