4-1 串

1. 串(String)是由零个或多个字符组成的有限序列。

2. 零个字符的串成为空串,它的长度为零。

3. 串中任意个连续的字符组成的子序列成为该串的子串。

4. 包含子串的串相应地成为主串。

5. 称两个串是相等的,当且仅当这两个串的值相等。(两个穿的长度相等,并且各个对应位置的字符都相等)

6. 由一个或多个空串组成的串‘’成为空格串。注意:此处不是空串,它的长度为串中空格字符的个数。

7. 空串:长度为0,不含任何字符的串。

8. 空串是任意串的子串,任意串是其自身的子串。

9. 对串的操作:

串赋值(StrAssign)

串比较(StrCompare)

扫描二维码关注公众号,回复: 5837752 查看本文章

int  StrCompare(HString S, HString T) {

      for (i=0;  i<S.length && i<T.length;  ++i)

      if (S.ch[i]!=T.ch[i])  return  S.ch[i]-T.ch[i];    

     return  S.length-T.length;

}// StrCompare

 

求串长(StrLength)

串联结(Contact)

Status Concat(SString &T, SString S1, SString S2) {

   if (S1[0]+S2[0] <= MAXSTRLEN) {     // 未截断

      T[1...S1[0]] = S1[1...S1[0]];    

      T[S1[0]+1...S1[0]+S2[0]] = S2[1...S2[0]];

      T[0] = S1[0]+S2[0];     uncut = TRUE;

    }else if (S1[0] < MAXSTRSIZE) { // 截断

           T[1...S1[0]] = S1[1...S1[0]];

           T[S1[0]+1...MAXSTRLEN] = S2[1...MAXSTRLEN-S1[0]];

           T[0] = MAXSTRLEN;      uncut = FALSE;

    } else  {       // 截断(仅取S1)

            T[0...MAXSTRLEN] = S1[0...MAXSTRLEN];

            uncut = FALSE;

    }

    return uncut;

} // Concat

 

求子串(SubString)

Status SubString(SString &Sub, SString S, int pos, int len) {

   if (pos < 1 || pos > S[0] || len < 0 || len > S[0]-pos+1)

      return ERROR;

   Sub[1…len] = S[pos…pos+len-1];

   Sub[0]=len;

   return OK;

} // SubString

 

串赋值

Status Strcopy(HString  &T, HString  S) {

    if (T.ch)  free(T.ch);

    n=S.length;

    if (n!=0) {

        T.ch=(char *)malloc(n*sizeof(char)));  

        T.ch[0..n-1]=S.ch[0..n-1];

        T. length=S.length;

      }

    return OK;

} Strcopy

1. s =‘ a1 a2 a3 … ai …an  ’ ( n≥0 )。  注意:必须有‘’

2. x = ‘123’  x = 123  作用:避免字符串与变量名或数的常量混淆。  

  1.   “串值大小” 是按 “词典次序”

4. 进行比较的,如:
StrCompare(“data”, “stru”)<0
StrCompare(“cat”, “case”)>0

5. 串是特殊的线性表,故其存储结构与线性表的存储结构类似,只不过组成串的结点是单个字符。

6. 定长顺序存储表示,也称为静态存储分配的顺序串, 即用一组地址连续的存储单元依次存放串中的字符序列。

 

7. “定长”、“静态”的意思可简单地理解为一个确定的存储空间,它的长度是不变的。

8. 堆分配存储表示堆存储结构的特点:仍以一组空间足够大的、地址连续的存储单元依次存放串值字符序列,但它们的存储空间是在程序执行过程中动态分配的。

9. 堆存储结构的优点:堆存储结构既有顺序存储结构的特点,处理(随机取子串)方便,操作中对串长又没有任何限制,更显灵活,因此在串处理的应用程序中常被采用。

10. 串的块链存储表示:串值也可用单链表存储,简称为链串。 链串与单链表的差异只是它的结点数据域为单个字符。

优点:便于插入和删除    缺点:空间利用率低

20. 为了提高空间利用率,可使每个结点存放多个字符 (这是顺序串和链串的综合 (折衷) ),称为块链结构。

21. 串的模式匹配算法:就是在主串中找出子串出现的位置。

 

1. 从主串 S 的第 pos 个字符起和模式 T 的第一个字符比较之,若相同,则继续比较后续字符;否则从主串 S  的下一个字符起再重新和模式 T 的字符比较之。

2. 时间复杂度:效率高时为O(m+n)   某些特殊的情况下,效率比较低,此时为O(m*n)

m和n分别为主串和子串的长度。

3. KMP算法

25. 当主串中第 i 个字符与模式串中第 j 个字符不等时,仅需将模式串向右滑动至第k个字符和主串中第i个字符比较即可。

26. KMP 算 法

int Index_KMP(SString S, SString T, int pos) {

     i = pos;   j = 1;

     while (i <= S[0] && j <= T[0]) {

         if (j = = 0 || S[i] = = T[j])

        

          { ++i;  ++j; }          // 继续比较后继字符

         else  j = next[j];          // 模式串向右移动

      }

      if (j > T[0])  return  i-T[0];            // 匹配成功

      else return 0;

 

猜你喜欢

转载自blog.csdn.net/weixin_42202174/article/details/88912773
4-1