• 字符串模式匹配


    2019/11/30

    字符串模式匹配

    若两个串长度相等且每个对应位置的字符都相等时,称这两个串 是相等的。

     

    1、定长顺序结构

    1 #define MAXLEN 255
    2 typedef struct{
    3   char ch[MAXLEN];
    4   int length;
    5 }SString;

    2、堆分配存储表示

    1 typedef struct{
    2   char *ch;
    3   int length;
    4 }

    上面五个操作称为 最小操作子集

     

    Index(S,T,pos):定位操作。若主串S中存在与串T值相同的子串,则返回它在主串S中第pos个字符后第一次出现的位置;

    否则函数值为0。

     1 int Index(String S, String T, int pos){
     2   if(pos>0){
     3     int n = StrLength(S);
     4     int m = StrLength(T);
     5     int i = pos;
     6     String sub = NULL;
     7   while(i<b-m+1){
     8     SubString(sub,S,i,m);
     9     if(StrCompare(sub,T)!=0)
    10       i++;
    11     else
    12       return i;
    13     }
    14   }
    15   return 0;
    16 }

    主串S:absaaasdcbvas

    串T:asd

    int position = Index(S,T,2);

     

    i-j+1是我们当前比较子串的第一个字符的位置

    i-j+2是下移了一个位置,找到下一个可能与当前模式串相同的子串,然后进行接下来的比较。

     1 int Index(SString S, SString T,int pos){
     2   int i=pos,j=1;  //主串位置i初始化为:初始寻找位置pos,j模式串位置初始化为1
     3   while(i<=S.length && j<=T.length){  //初始位置i小于等于主串的长度&&比较的子串这个标记有没有比较到最后一个字符,如果比较到最后,就可以终止循环了。
     4     if(S.ch[i]==T.ch[j]){    //判断当前对应标记字符是否相等。
     5       i++;  //如果相等,比较下一个字符
     6       j++;
     7     }
     8     else{  //不相等,将主串中子串第一个位置的标记下移一位,
     9       i=i-j+2;  //i-j+1是当前比较子串第一个字符的位置;i-j+2是下移了一个位置,找到下一个可能与模式串相同的子串,然后进行接下来的比较。
    10       j=1;  //模式串标记归1:还要从第一个位置开始比较
    11     }
    12     if(j>T.length)    //如果j比较到了最后一个位置,并且还是相等的,此时我们还要+1,就大于对应模式串的长度。
    13       return i-T.length;    //返回对应子串位置
    14     else
    15       return 0;    //失败返回0
    16   }
    17 }


    能有什么困难?都是可以解决的!

  • 相关阅读:
    (11)《数据结构与算法》之赫夫曼树
    (8)《数据结构与算法》之查找算法
    String的用法——转换功能
    结合redis 的List数据结构特性扩展 栈与队列
    上传文件返回前端json的时候,去除返回值带 <pre style="word-wrap:break-word;white-space:prewrap;"></pre>的问题
    Java休眠方式
    DButils自增ID转换失败
    Java元注解
    java 单例模式:饿汉式与懒汉式
    java do -while 三种用法
  • 原文地址:https://www.cnblogs.com/LinQingYang/p/11963964.html
Copyright © 2020-2023  润新知