本人是C语言菜鸟遇到两道有关问题,求高手解答思路
本人是C语言初学者遇到两道问题,求高手解答思路
1.给定字符串A和B,输出A和B中的最大公共子串.
比如A = "aocdfe", B = "pmcdfa" 则输出"cdf"
2.实现一个程序,从键盘输入两个字符串,连接两个字符串,并去掉其重复子串,输入的字符串中只能是字符和空格,字符串以空格进行分割.
例:输入两个字符串如下:
"what is your name"
"my name is bourne"
则去掉两个字符串中都包含的is和name输入: "what your my bourne"
本人是C语言初学者遇到两道问题,求高手解答思路,最好是简单一些~~~~
------解决方案--------------------
调用系统提供的库函数
或者自己用
回溯算法实现
------解决方案--------------------
关于第二题 :不知道你是不是学的是 谭浩强 的书,如果是的话,它上面有一个例题,就是讲怎样识别一个字符串里有多少个单词,然后你可以参考他的识别方法,把里面的单词存储在新的字符数组里,再用strcasecmp 或者 strcmp 函数比较,再把不同的字符数组进行连接 。
关于第一题,我的想法有点复杂,就不提供了。这题如果有ACM的人来做的话,应该比较简单,这应该是算法问题。
这是我在CSDN论坛上第一次答题,仅作抛砖引玉之用,希望楼主
------解决方案--------------------
希望楼主找到满意答案,第一次在CSDN上回复,有点鸡动
------解决方案--------------------
第一个用循环试试
当它指向A的第一个字母
依次试B的内容 有一样的就保留
接着指向A的第二个字母
……
懂?
------解决方案--------------------
第一题的答案如下:
1.给定字符串A和B,输出A和B中的最大公共子串.
比如A = "aocdfe", B = "pmcdfa" 则输出"cdf"
2.实现一个程序,从键盘输入两个字符串,连接两个字符串,并去掉其重复子串,输入的字符串中只能是字符和空格,字符串以空格进行分割.
例:输入两个字符串如下:
"what is your name"
"my name is bourne"
则去掉两个字符串中都包含的is和name输入: "what your my bourne"
本人是C语言初学者遇到两道问题,求高手解答思路,最好是简单一些~~~~
------解决方案--------------------
调用系统提供的库函数
或者自己用
回溯算法实现
------解决方案--------------------
关于第二题 :不知道你是不是学的是 谭浩强 的书,如果是的话,它上面有一个例题,就是讲怎样识别一个字符串里有多少个单词,然后你可以参考他的识别方法,把里面的单词存储在新的字符数组里,再用strcasecmp 或者 strcmp 函数比较,再把不同的字符数组进行连接 。
关于第一题,我的想法有点复杂,就不提供了。这题如果有ACM的人来做的话,应该比较简单,这应该是算法问题。
这是我在CSDN论坛上第一次答题,仅作抛砖引玉之用,希望楼主
------解决方案--------------------
希望楼主找到满意答案,第一次在CSDN上回复,有点鸡动
------解决方案--------------------
第一个用循环试试
当它指向A的第一个字母
依次试B的内容 有一样的就保留
接着指向A的第二个字母
……
懂?
------解决方案--------------------
第一题的答案如下:
- C/C++ code
// FindString.cpp : 定义控制台应用程序的入口点。 // #include "stdio.h" #include "malloc.h" #include "string.h" char *maxsubstr(char *str1, char *str2) { char *p1, *p2, *q1, *q2, *destp; char *substr; int max = 0, len; p1 = str1; while(*p1 != '/0') { q1 = str2; while(*q1 != '/0') { len = 0; p2 = p1; q2 = q1; while((*p2 != '/0')&&(*q2 != '/0')) { if(*p2 == *q2) { p2 ++;q2 ++;len ++; } else { break; } } if(len > max) { max = len; destp =p1; } q1++; } p1++; } substr=(char*)malloc(sizeof(char)*max); strncpy(substr,destp,max); return substr; } int main() { char *s1="aocdfe"; char *s2="pmcdfa"; char *sub; printf("%s/n%s/n",s1,s2); sub = maxsubstr(s1,s2); printf("the max sub string is:%s",sub); return 0; }
------解决方案--------------------
其实第二题,先用一个**str存储要从键盘上输入的字符串,在进行与第一题类似的匹配,把公共的子串不打印出来就可以了的。
具体细节,LZ可以自己写一下
------解决方案--------------------
第一题用动态规划求解,最大公共子序列问题,google之。
第二题先处理单个字符串,像2楼说的那样,把单词分割出来存到二维数组里,这样就产生了两个字符数组,删掉里边重复的,然后输出。有点儿麻烦,暂时没想到更好的办法,静待大牛出现
------解决方案--------------------
------解决方案--------------------
------解决方案--------------------
第二个题目的答案:
- C/C++ code
#include "stdio.h" #include "string.h" #define N 4 void lookup_keyword(char *desired_word[],char *keyword_table[],int a[],int b[],int *m,int *n ) { int i,j; int aCount = 0,bCount = 0; for(j = 0;j < N;j ++) { for(i = 0;i < N;i ++) { if(strcmp(keyword_table[j],desired_word[i]) == 0) { a[aCount ++] = i; b[bCount ++] = j; } } } *m = aCount; *n = bCount; } int main(int argc, char* argv[]) { char *a_table[N] = {"what","is","you","name"}; char *b_table[N] = {"my","name","is","tom"}; int a[N],b[N]; int i,j,m,n,tag; lookup_keyword(a_table,b_table,a,b,&m,&n ); //for(i =0;i<m;i++) // printf("%2d",a[i]); //printf("\n"); // for(i =0;i<n;i++) // printf("%2d",b[i]); //printf("\n"); // printf("%d,%d",m,n); for(i = 0;i < N;i ++) { tag = 0; for(j = 0;j < m;j ++) { if(i == a[j]) tag = 1; } if(tag == 0) printf("%8s",a_table[i]); } for(i = 0;i < N;i ++) { tag = 0; for(j =0;j < n;j ++) { if(i == b[j]) tag = 1; } if(tag == 0) printf("%8s",b_table[i]); } printf("\n"); return 0; }