150 likes | 302 Views
第四章 串. 串类型的定义 串的表示和实现 串的模式匹配算法 串操作应用举例. 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];
E N D
第四章 串 • 串类型的定义 • 串的表示和实现 • 串的模式匹配算法 • 串操作应用举例
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]; • int strlen ( char s[ ] ) • { int i; • for (i=0; s[i]!='\0'; i++ ); • return (i); • }
串的连接 • 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); • }
求子串 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 ); • }
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); • }
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++; } • }
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 ); • }
#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; • }
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 ); • }
4.1 串操作应用举例 • 包括串的插入、删除等基本操作。
插入 • 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 ); • }
删除 • 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); • }
串的比较 • 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 ); • }
练习 • 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的长度.