首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

本人是C语言菜鸟遇到两道有关问题,求高手解答思路

2012-09-02 
本人是C语言初学者遇到两道问题,求高手解答思路1.给定字符串A和B,输出A和B中的最大公共子串.比如A aocd

本人是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的第二个字母
……
懂?
[解决办法]
第一题的答案如下:

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楼说的那样,把单词分割出来存到二维数组里,这样就产生了两个字符数组,删掉里边重复的,然后输出。有点儿麻烦,暂时没想到更好的办法,静待大牛出现
[解决办法]
探讨
第一个用循环试试
当它指向A的第一个字母
依次试B的内容 有一样的就保留
接着指向A的第二个字母
……
懂?

[解决办法]
探讨
第一题用动态规划求解,最大公共子序列问题,google之。
第二题先处理单个字符串,像2楼说的那样,把单词分割出来存到二维数组里,这样就产生了两个字符数组,删掉里边重复的,然后输出。有点儿麻烦,暂时没想到更好的办法,静待大牛出现

[解决办法]
第二个题目的答案:
C/C++ code
#include "stdio.h"#include "string.h"#define N  4void  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;} 


[解决办法]
上面的代码说明:

数组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
[解决办法]
第一题我貌似做过,通过递归~
查找是否有一个字母一个字母查,如果有相同看下一位是否相同,直到下一位不相同,然后对比现存储的最大字符串和这个字符串长度,如果大于就赋给最大字符串。递归完就出来了,貌似是本教科书上的例题。

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

热点排行