本人是C语言初学者遇到两道问题,求高手解答思路

p4042333869 2011-08-13 10:32:53
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语言初学者遇到两道问题,求高手解答思路,最好是简单一些~~~~
...全文
285 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
游戏设计师 2011-08-14
  • 打赏
  • 举报
回复
第一题我貌似做过,通过递归~
查找是否有一个字母一个字母查,如果有相同看下一位是否相同,直到下一位不相同,然后对比现存储的最大字符串和这个字符串长度,如果大于就赋给最大字符串。递归完就出来了,貌似是本教科书上的例题。

第二题应该动态数组把,依次取的字符串A的字母,如果下一位为\t的时候就存储到A数组的一个元素中,然后再读再存储,直到\0,然后再读字符串B。最后对比A B两个数组,如果元素相同就A B同时删掉,直到对比完。然后输出A数组的元素再输出B数组的元素~
没写代码,不过应该能看的懂。看不懂就说明我表达能力太差了~
tianmo2010 2011-08-14
  • 打赏
  • 举报
回复
上面的代码说明:

数组a,b分别用于存储a_table和b_table中有相同单词的脚小标

m,n分别表示a_table和b_table中相同单词的个数

如本题中(我是用a_table参照b_table)有:a[0]=3 ,a[1]= 1 ;b[0]=1 ,b[1]= 2
tianmo2010 2011-08-14
  • 打赏
  • 举报
回复
第二个题目的答案:
#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;
}

希望对你有帮助。
暮雨晨舟 2011-08-14
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 kecookier 的回复:]
第一题用动态规划求解,最大公共子序列问题,google之。
第二题先处理单个字符串,像2楼说的那样,把单词分割出来存到二维数组里,这样就产生了两个字符数组,删掉里边重复的,然后输出。有点儿麻烦,暂时没想到更好的办法,静待大牛出现
[/Quote]

strstr()判断是否在另一字符串中存在,如果不存在,memcpy拷贝到一个新的数组,最后输出即可
jernymy 2011-08-13
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 le920 的回复:]
第一个用循环试试
当它指向A的第一个字母
依次试B的内容 有一样的就保留
接着指向A的第二个字母
……
懂?
[/Quote]
++
EP 2011-08-13
  • 打赏
  • 举报
回复
希望楼主找到满意答案,第一次在CSDN上回复,有点鸡动
EP 2011-08-13
  • 打赏
  • 举报
回复

关于第二题 :不知道你是不是学的是 谭浩强 的书,如果是的话,它上面有一个例题,就是讲怎样识别一个字符串里有多少个单词,然后你可以参考他的识别方法,把里面的单词存储在新的字符数组里,再用strcasecmp 或者 strcmp 函数比较,再把不同的字符数组进行连接 。

关于第一题,我的想法有点复杂,就不提供了。这题如果有ACM的人来做的话,应该比较简单,这应该是算法问题。

这是我在CSDN论坛上第一次答题,仅作抛砖引玉之用,希望楼主
5t4rk 2011-08-13
  • 打赏
  • 举报
回复
调用系统提供的库函数

或者自己用

回溯算法实现
kecookier 2011-08-13
  • 打赏
  • 举报
回复
第一题用动态规划求解,最大公共子序列问题,google之。
第二题先处理单个字符串,像2楼说的那样,把单词分割出来存到二维数组里,这样就产生了两个字符数组,删掉里边重复的,然后输出。有点儿麻烦,暂时没想到更好的办法,静待大牛出现
p4042333869 2011-08-13
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 tianmo2010 的回复:]

其实第二题,先用一个**str存储要从键盘上输入的字符串,在进行与第一题类似的匹配,把公共的子串不打印出来就可以了的。

具体细节,LZ可以自己写一下
[/Quote]
嗯嗯~~~其实我刚接触C语言不久,能不能具体说说你的思路
我的想法是把字符串先全倒过来“tneduts a ma I”,在将逐个单词倒回来“students. a am I”,现在在实现中
p4042333869 2011-08-13
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 tianmo2010 的回复:]

你自己仔细体会一下,可以用慢慢演算,理解。

希望对你帮助。
[/Quote]
谢谢~~~我会去体会体会的~~带我消化完之后,再去相信第二题..非常感谢!!
p4042333869 2011-08-13
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 le920 的回复:]

第一个用循环试试
当它指向A的第一个字母
依次试B的内容 有一样的就保留
接着指向A的第二个字母
……
懂?
[/Quote]
不懂~~~如果说是求公共子串的话,我会求,可是问题要最大的公共子串~~不知如何去求??
tianmo2010 2011-08-13
  • 打赏
  • 举报
回复
其实第二题,先用一个**str存储要从键盘上输入的字符串,在进行与第一题类似的匹配,把公共的子串不打印出来就可以了的。

具体细节,LZ可以自己写一下
tianmo2010 2011-08-13
  • 打赏
  • 举报
回复
你自己仔细体会一下,可以用慢慢演算,理解。

希望对你帮助。
tianmo2010 2011-08-13
  • 打赏
  • 举报
回复
第一题的答案如下:

// 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;
}

le920 2011-08-13
  • 打赏
  • 举报
回复
第一个用循环试试
当它指向A的第一个字母
依次试B的内容 有一样的就保留
接着指向A的第二个字母
……
懂?

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧