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