zoukankan      html  css  js  c++  java
  • 字符串中查找子串返回序号

    在字符串t中查找子串p时,求第一次匹配的序号。

    算法思想:假设t和P是两个给定的串,在t中寻找与p相同子串的过程叫做模式匹配,一般t称为正文,p称为模式,t的长度大于p的长度。如果在t中找到等于p的子串,则匹配成功,否则匹配失败。

    设字符串t为t[n],字符串p为p[m],其中n,m分别为字符串t和p的长度,实现模式匹配的简单算法为:对于i=0,1,2,..n-m,依次进行下面匹配步骤,最多进行n-m+1次。匹配步骤为,用p[0],p[1],...p[m-1]依次与t[i],t[i+1]...t[i+m-1]进行比较,如果p[0]=t[i],p[1]=t[i+1],。。。p[m]=t[i+m-1],那么匹配成功,整个算法结束,否则,一定存在某个整数k,0<=k<=m-1,使得p[k]!=t[k+1],一旦出现这种问题,终止比较,执行下一次的匹配步骤,如果执行了n-m+1次匹配步骤后,在t中没有找到 等于p的子串,那么匹配失败。

     1 #include<stdio.h>
     2 #include<stdlib.h>
     3 #include <string.h>
     4 #include<ctype.h>
     5 int bali(char *t,char *p)
     6 {
     7     int m,n,i,j,bool;
     8     n=strlen(t);m=strlen(p);/*取字符串长度*/
     9    i=0;bool=1;
    10     while((i<=n-m)&&(bool!=0))/*从第一个查询,子串是否在主串中*/
    11     {j=0;
    12     while((j<=m-1)&&(p[j]==t[i+j]))/*若第一轮相同,可继续查找,否则进行下一轮继续查找*/
    13         j++;
    14    if(j<=m-11)
    15    {
    16         bool=1;i++;/*若未查到继续查找*///
    17    }
    18     else 
    19         bool=0;/*查找到了bool为0*/
    20 }
    21     if(bool==0)
    22     {cout<<"存在目标模式,且第一次匹配序号为"<<endl;
    23         return (i+1);/*查找到返回首字符所在的位置*/
    24     }
    25     else{
    26         cout<<"不存在目标模式"<<endl;
    27     return (0);/*bool=1,返回0,表示串p不在t中*/
    28     }
    29 }
    30 void main(){
    31 int k;
    32 char   str1[]="adedefghdefijk";
    33 char  str2[]="def";
    34 k=horspool(str1,str2);
    35 printf("k=%d
    ",k);
    36 }
    View Code
  • 相关阅读:
    类变量、成员变量、实例变量、局部变量、静态变量、全局变量的解释
    String的属性和方法
    数组的扩容
    以下实例演示了如何通过 List 类的 Arrays.toString () 方法和 List 类的 list.Addall(array1.asList(array2) 方法将两个数组合并为一个数组
    数组获取最大值和最小值
    Java字符串反转
    IO-3
    IO-2
    IO流
    泛型、MAP集合
  • 原文地址:https://www.cnblogs.com/lqs-zsjky/p/4477641.html
Copyright © 2011-2022 走看看