《数据结构教程》(李春葆 主编)课后习题【练习题4】

【4.1】 

 1 // 4.1
 2 #include <stdio.h>
 3 #define MAXSIZE 1000    //字符串最大长度
 4 int pattern_index(char t[],char s[])    //BF算法
 5 {
 6     int i,j;
 7     for(i=0;s[i];i++)
 8         if(t[0]=='?' || s[i]==t[0]){    //第一个字母匹配成功
 9             for(j=0;t[j];j++)
10                 if(s[i+j]!=t[j] && t[j]!='?')
11                     break;
12             if(!t[j]) return i;
13         }
14     return -1;
15 }
16 int main()
17 {
18     char c,s[MAXSIZE],t[MAXSIZE];
19     printf("请输入目标字符串:\n");
20     while(scanf("%[^\n]",s)!=EOF){
21         printf("请输入匹配字符串:\n");
22         //scanf("%[^\n]",t);
23         scanf("%s",t);
24         scanf("%c",&c);
25         printf("匹配位置是:\n");
26         printf("%d\n",pattern_index(t,s));
27         printf("\n");
28         //为下一次做准备
29         printf("请输入目标字符串:\n");
30     }
31     return 0;
32 }

 【4.2】

 1 #include <stdio.h>
 2 #define MAXSIZE 1000
 3 /*
 4 int dp[MAXSIZE+1][MAXSIZE+1];
 5 void GetCsq(char a[],char b[],char r[])    //利用求最长公共子序列的算法,求两个子串的公共子串
 6 {
 7     int i,j,len=0,x=0,y=0,alen,blen;
 8     for(alen=0;a[alen];alen++)    //记录长度并初始化dp[][]
 9         dp[0][alen] = 0;
10     for(blen=0;b[blen];blen++)
11         dp[blen][0] = 0;
12     //生成dp[][]
13     for(i=1;i<=alen;i++)
14         for(j=1;j<=blen;j++)
15             if(a[i-1]==b[j-1]){
16                 dp[i][j] = dp[i-1][j-1] + 1;
17                 if(i>x && j>y){
18                     r[len++] = a[i-1];
19                     x = i,y = j;
20                 }
21             }
22             else 
23                 dp[i][j] = dp[i-1][j]>dp[i][j-1] ? dp[i-1][j] : dp[i][j-1];
24     r[len] = '\0';
25 }
26 */
27 
28 void GetCsq(char a[],char b[],char r[])    //获得字符串a和b的公共子序列r
29 {
30     int i,j,x=0,len=0;
31     for(i=0;a[i];i++){
32         for(j=x;b[j];j++){
33             if(a[i]==b[j]){    //依次比较
34                 r[len++] = a[i];
35                 x = j+1;
36                 break;
37             }
38         }
39     }
40     r[len] = '\0';
41 }
42 
43 int main()
44 {
45     char a[MAXSIZE],b[MAXSIZE],r[MAXSIZE];
46     printf("请输入两个子串:\n");
47     while(scanf("%s%s",a,b)!=EOF){
48         GetCsq(a,b,r);
49         printf("其公共子串为:\n");
50         printf("%s\n",r);
51         printf("\n");
52         printf("请输入两个子串:\n");
53     }
54     return 0;
55 }

【4.3】

 1 #include <stdio.h>
 2 #define MAXSIZE 1000
 3 void GetNextval(char t[],int nextval[])    //获得nextval数组
 4 {
 5     int j=0,k=-1;
 6     nextval[0] = -1;
 7     while(t[j]){
 8         if(k==-1 || t[j]==t[k]){
 9             j++,k++;
10             if(t[j]==t[k])
11                 nextval[j] = nextval[k];
12             else 
13                 nextval[j] = k;
14         }
15         else
16             k = nextval[k];
17     }
18 }
19 void PrintNextval(char t[],int nextval[])    //输出nextval数组
20 {
21     int i;
22     for(i=0;t[i];i++)
23         printf("\t%d",i);
24     printf("\n");
25     for(i=0;t[i];i++)
26         printf("\t%d",nextval[i]);
27     printf("\n");
28 }
29 int main()
30 {
31     char t[MAXSIZE],s[MAXSIZE];
32     int nextval[MAXSIZE];
33     printf("请输入模式字符串:\n");
34     while(scanf("%s",t)!=EOF){
35         printf("其nextval数组为:\n");
36         GetNextval(t,nextval);
37         PrintNextval(t,nextval);
38         printf("\n");
39         printf("请输入模式字符串:\n");
40     }
41     return 0;
42 }

 

Freecode : www.cnblogs.com/yym2013

posted @ 2014-04-25 12:43  Freecode#  阅读(659)  评论(0编辑  收藏  举报