4.串

  • 串的结构定义:
    • 定长存储表示:
      typedef struct
      {
          char str[maxSize+1];
          int length;
      }Str;
    • 变长存储表示:
      typedef struct
      {
          char *ch;
          int length;
      }Str;
  • 串的基本操作:
    • 赋值操作:
      int strassign(Str& str, char* ch)
      {
          if(str.ch)
              free(str.ch);   //释放原串
          int len = 0;
          char *c = ch;
          while(*c)
          {
              ++len;
              ++c;
              
          }
          
          if(len==0)
          {
              str.ch = NULL;
              str.length = 0;
              return ture;
          }
          else
          {
              str.ch = (char* )malloc(sizeof(char)*(len+1));
              if(str.ch==NULL)
                  return false;
              else
              {
                  c=ch;
                  for(int i=0; i<len; ++i,++c)
                      str.ch[i]=*c;
                  str.length = len;
                  return true;
              }
          }
      }
    • 取串长度操作:
      int strlength(Str str)
      {
          return str.length;
      }
    • 串比较操作:
      int strcompare(Str s1,Str s2)
      {
          for(int i=0;i<s1.length && i<s2.length;++i)
              if(s1.ch[i]!=s2.ch[i])
              return s1.ch[i] - s2.ch[i];
          return s1.length -s2.length;
      }
    • 串连接操作:
      int concat(Str& str, Str str1, Str str2)
      {
          if(str.ch)
          {
              free(str.ch);
              str.ch=NULL;
          }
          str.ch=(char*)malloc(sizeof(char)*(str1.length+str2.length+1));
          if(str.ch==NULL)
              return false;
          int i = 0;
          while(i<str1.length)
          {
              str.ch[i]=str1.ch[i];
              ++i;
          }
          int j = 0;
          while(j <=str2.length)
          {
              str.ch[i+j] = str2.ch[j];
              ++j;
          }
          str.length = str1.length +str2.length;
          return true;
      }
    • 求子串操作:
      //求str串从pos 位置开始,长度为len的子串
      int substring(Str& substr,Str str, int pos, int len)
      {
          if(pos<0||pos>=str.length||len<0||len>=str.lenght-pos)
              return false;
          if(substr.ch)
          {
              free(substr.ch);
              substr.ch = NULL;
          }
          if(len == 0)
          {
              substr.ch = NULL;
              substr.length = 0;
              return true;
          }
          else
          {
              substr.ch = (char*) malloc(sizeof(char)*(len+1));
              int i = pos;
              int j = 0;
              while(i<pos+len)
              {
                  substr.ch[j] = str.ch[i];
                  ++i;
                  ++j;
              }
              substr.ch[j] = NULL;
              substr.length = len;
              return true;
          }
      }
    • 串清空操作:
      int clearstring(Str& str)
      {
           if(str.ch)
            {
               free(str.ch);
               str.ch=NULL;
            }
           str.length = 0;
           return ture;
      }
  • 串的模式匹配算法:
    • 简单的模式匹配算法:
      //从主串第一个位置和模式串比较
      //相等则比较后续字符
      //否则从主串的第二个位置进行比较
      int index(Str str,Str substr)
      {
          int i=0,j=0,k=i;
          while(i<str.length && j<substr.length)
          {
              if(str.ch[i]==substr.ch[i])
              {
                  ++i;
                  ++j;
              }
              else
              {
                  j=0;
                  i=++k;
              }
          }
          if(j==substr.length)
              return k;
          else return -1;
      }
    • KMP算法:
      • http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html
      • https://subetter.com/articles/2018/04/how-to-understand-kmp.html
      • //求next数组
        void getnext(Str substr, int next[])
        {
            int i=0, j=-1;
            next[0]=-1;
            while(i<substr.length)
            {
                if(j=-1||substr.ch[i]==substr.ch[j])
                {
                    ++i;
                    ++j;
                    next[i]=j;
                }
                else
                    j=next[j];
            }
        }
      • int KMP(Str str, Str substr, int next[])
        {
            int i=0,j=0;
            while(i<str.length && j<substr.length)
            {
                if(str.ch[i]==substr.ch[j])
                {
                    ++i;
                    ++j;
                }
                else
                {
                    j=next[j];
                    if(j==-1)
                    {
                        j=0;
                        ++i;
                    }
                }
            }
            if(j=substr.length)
            {
                return i-substr.length;
            }
            else 
                return -1;
        }

猜你喜欢

转载自www.cnblogs.com/frl520/p/9447433.html
今日推荐