题目大意:
给你两个字符串,求第一个字符串的某一个排列和第二个字符串的最长的公共子串。要求按字典顺序输出公共子串。
算法分析:
由于是一个串的某个排列(任意顺序的),实际上就是求两个字符串相同的字符的个数,并且按照顺序输出即可。我的做法是将两个字符串映射到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;
}
思考:
此题目有点技巧,但不是太难。