uva-10252-Common Permutation

来源:互联网 发布:淘宝优惠券网 编辑:程序博客网 时间:2024/03/29 22:05

题目大意:

            给你两个字符串,求第一个字符串的某一个排列和第二个字符串的最长的公共子串。要求按字典顺序输出公共子串。

算法分析:

            由于是一个串的某个排列(任意顺序的),实际上就是求两个字符串相同的字符的个数,并且按照顺序输出即可。我的做法是将两个字符串映射到26个字符的数组中,数组中放的是字符出现的次数,然后比较两个字符串的映射数组,直接输出较少的那个字符的次数(不为0)。

代码:

       #include<stdio.h>
#include<string.h>

char str1[1001],str2[10001];
int a1[27],a2[27];

void init()
{
 int len1,len2;
 int i;
 memset(a1,0,sizeof(a1));
 memset(a2,0,sizeof(a2));
 len1=strlen(str1);
 len2=strlen(str2);
 for(i=0;i<len1;i++)
  a1[str1[i]-'a']++;
 for(i=0;i<len2;i++)
  a2[str2[i]-'a']++;
}

int min(int m,int n)
{
 return m<n?m:n;
}

int main()
{
 int i,j;
 while(1)
 {
  memset(str1,0,sizeof(str1));
  memset(str2,0,sizeof(str2));
  if(gets(str1)==NULL)
   break;
  gets(str2);
  init();
  for(i=0;i<26;i++)
  {
   if(a1[i]!=0&&a2[i]!=0)
   {
    for(j=0;j<min(a1[i],a2[i]);j++)
     printf("%c",i+'a');
   }
  }
  printf("/n");
 }
 return 0;
}

思考:

此题目有点技巧,但不是太难。

原创粉丝点击