slide1 n.
Download
Skip this Video
Loading SlideShow in 5 Seconds..
第四章 串 PowerPoint Presentation
Download Presentation
第四章 串

Loading in 2 Seconds...

play fullscreen
1 / 15

第四章 串 - PowerPoint PPT Presentation


  • 120 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


Download Now 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
slide1

第四章 串

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

4.1串类型的定义

串的基本概念及存贮结构

  • V是程序设计语言所使用的字符集,由V上的字符组成的序列称作字符串。
  • 空串
  • 串的长度
  • 子串
  • 串的存贮
slide3

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);
  • }
slide4
串的连接
  • 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);
  • }
slide5
求子串

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 );
  • }
slide6

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);
  • }
slide7
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++; }
  • }
slide8
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 );
  • }
slide9
#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;
  • }
slide10
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 );
  • }
slide11
4.1 串操作应用举例
  • 包括串的插入、删除等基本操作。
slide12
插入
  • 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 );
  • }
slide13
删除
  • 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);
  • }
slide14
串的比较
  • 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 );
  • }
slide15
练习
  • 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的长度.