第四章  串
Download
1 / 15

第四章 串 - PowerPoint PPT Presentation


  • 116 Views
  • Uploaded on

第四章 串. 串类型的定义 串的表示和实现 串的模式匹配算法 串操作应用举例. 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];

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about ' 第四章 串' - saniya


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.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript

第四章 串

  • 串类型的定义

  • 串的表示和实现

  • 串的模式匹配算法

  • 串操作应用举例


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的长度.


ad