1 / 15

第四章 串

第四章 串. 串类型的定义 串的表示和实现 串的模式匹配算法 串操作应用举例. 4.1 串类型的定义. 串的基本概念及存贮结构 V 是程序设计语言所使用的字符集,由 V 上的字符组成的序列称作字符串。 空串 串的长度 子串 串的存贮. 4.2 串的表示和实现. 串的运算 求串的长度 #define MAXN 100 typedef enum { fail, success } status; typedef enum { false, true} boolean; char s[MAXN], s1[MAXNj, s2[MAXN];

saniya
Download Presentation

第四章 串

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第四章 串 • 串类型的定义 • 串的表示和实现 • 串的模式匹配算法 • 串操作应用举例

  2. 4.1串类型的定义 串的基本概念及存贮结构 • V是程序设计语言所使用的字符集,由V上的字符组成的序列称作字符串。 • 空串 • 串的长度 • 子串 • 串的存贮

  3. 4.2 串的表示和实现 • 串的运算 求串的长度 • #define MAXN 100 • typedef enum { fail, success } status; • typedef enum { false, true} boolean; • char s[MAXN], s1[MAXNj, s2[MAXN]; • int strlen ( char s[ ] ) • { int i; • for (i=0; s[i]!='\0'; i++ ); • return (i); • }

  4. 串的连接 • status strcat (s1, s2) • char s1[ ], s2[]; • { int i, j, k; • if ((i=strlen (s1)) + (j=strlen (s2) )>=MAXN) • return (fail); • for (k=0; k<=j; k++ ) • s1[i+k]=s2[k]; • return (success); • }

  5. 求子串 status strsub (char s1[ ], int i, int j, char s2[ ] ) • { int m, k; • if ( i<0 || i>= (m=strlen(s1) ) ) • return (fail ); • if (j<0 || i+j>m) return (fail ); • for (k=0; k<j; k++ ) • s2[k]=s1[i +k]; • s2[k]='\0'; • return (success ); • }

  6. 4.3 串的模式匹配算法 • 模式匹配的简单算法 • #define MAXN 100 • #define MAXM 30 • char t[MAXN], p[MAXM]; • int simple_ match (t, p, n, m) • char t[ ], p[ ]; • int n, m; • { int i, j, k; • for (i=0; i<=n-m;i++) • { for (j=0, k=i; j<m && t[k]==p[j]; k++, j++); • if (j= =m) return(i); • } • return(- 1); • }

  7. 2.模式匹配的KMP(Kunth Morris Pratt)方法 • #define MAXN 100 • #define MAXM 20 • char t [MAXN], p [MAXM]; • int flink [MAXM]; • int m, n; • Void faillink (char p[ ], int flink[ ], int m) • { int j, k; • flink [0] = - 1; • j=1; • while (j<m) • { k=flink[j-1] • while ( k !=-1 && p[k]!=p[j-1] ) • k = flink[k]; • flink [j] = k + 1; • j++; } • }

  8. int kmp_match(char t[ ], char p[ ], • int flink[ ], int n, int m) • { int i, j; • i= 0; • j= 0; • while (i<n) • { while (j!=-1 && p[j]!=t[i]) • j = flink[j]; • if (j=m-1) return(i-m+1); • i+ +; j+ +; • } • return (-- 1 ); • }

  9. #define MAXN 100 • #define MAXM 20 • char t[MAXN], p[MAXM]; • int n, m; • int d[26); • void df(p, d, m) • char p[ ]; • int d[ ], m; • { int i; • for (i=0; i<26; i+ + ) • d[i] =m; • for (i= 0; i<m-1 ; i++ ) • d[P[i]-'a']=m-i-1; • }

  10. int bm_match(t, p, d, n, m) • char t[],p[]; • int d[], n,m; • { int i, j, k; • i=m-1; • do { j=m-1; • k=i; • while (j>=0 && p[j]==t[k]) • { j--; • k--; • } • if (j<0) return (i-m+1); • i=i+d[t[i]-'a']; • } while (i<n); • return (-1 ); • }

  11. 4.1 串操作应用举例 • 包括串的插入、删除等基本操作。

  12. 插入 • status strins (s1, i, s2) • char s1[ ], s2[ ]; int i ; • { int m, n, k; • if (i<0 || i> ( m=strlen(s1) ) • || m+( n=strlen (s2 ) ) >MAXN) • return ( fail ); • for (k=m; k>=i; k--) s1[k+n] = s1[k]; • for (k=0; k<n; k++ ) s1[i+k] = s2[k]; • return (success ); • }

  13. 删除 • status strdel (s, i, j) • char s[ ]; • int i,j; • { int m, k; • if (i<0|| i >= ( m=strlen(s) ) ) • return (fail); • if (i+j>=m) s[i]='\0'; • else for (k=0; k<=m-i-j;k++) • s[i+k]=s[i+j+k]; • return (success); • }

  14. 串的比较 • boolean strequ (s1, s2) • char s1[ ], s2[ ]; • { int i=0; • while (s1[i]= =s2[i]&& s1[i]!='\0' • && S2[i]!='\0') • i++; • if ( s1[i]=='\0' && s2[i]=='\0‘ ) • return ( true ) ; • else return ( false ); • }

  15. 练习 • 1.输入一段正文,统计其中字母.数字和其它字符的个数。 • 2.写出函数substring(s,n,f,l,sub)的算法,从长度为n的字符串S中找出首末字符的序号分别为f,l的子串放到sub中。 • 3.求出字符串”abcabcabc”的失败链接值。 • 4.Converse(s) 将字符串s的内容颠到次序存放。 • 5.写出函数replace(s1,s2,s3,n,ll,m)的算法,将s1中所有s2的出现都置换成s3,n,l,m分别是字符串s1,s2,s3的长度.

More Related