【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("请输入目标字符串:
");
20 while(scanf("%[^
]",s)!=EOF){
21 printf("请输入匹配字符串:
");
22 //scanf("%[^
]",t);
23 scanf("%s",t);
24 scanf("%c",&c);
25 printf("匹配位置是:
");
26 printf("%d
",pattern_index(t,s));
27 printf("
");
28 //为下一次做准备
29 printf("请输入目标字符串:
");
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] = ' ';
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] = '