uva-10252-Common Permutation

本文介绍了一种求解两字符串最长公共子串的问题解决方法。通过统计字符频率并对比,实现了快速查找相同字符并按字典序输出的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目大意:

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

算法分析:

            由于是一个串的某个排列(任意顺序的),实际上就是求两个字符串相同的字符的个数,并且按照顺序输出即可。我的做法是将两个字符串映射到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;
}

思考:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值