poj 2159 字母映射

题意:原来字母变换不一定只是加一,排列也不一定是按照案例来的。。。被虐了。。。

思路:只要统计出两个字符串中字符的个数,然后用一次排序,来看是否满足映射关系就可以。

例如统计个数的数组a,b应该是

0,1

1,0

0,0

0,2

2,0

...

这样就是如果右边的原始字符数组是加一变换的话,坐标的数组统计的个数就会相应的下移一格。。。加二,加三依次类推,所以用一次快排,然后比较即可。

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int main()
{
  char str[105];
  char st[105];
  int a[26],b[26];
  int len1,len2;
  while(scanf("%s%s",str,st)!=EOF)
  {
    len1=strlen(str);
    len2=strlen(st);
    memset(a,0,sizeof(a));
    memset(b,0,sizeof(b));
    if(len1!=len2)
    {printf("NO\n");continue;}
      for(int i=0;i<len1;i++)
      a[str[i]-'A']++;
      for(int i=0;i<len2;i++)
      b[st[i]-'A']++;
      //for(int i=0;i<26;i++)
      //printf("%d  %d\n",a[i],b[i]);
      //system("pause");
      sort(a,a+26);
      sort(b,b+26);
      int k;
      for(k=0;k<26;k++)
      {
        //printf("%d,%d\n",a[k],b[k]);
        if(a[k]!=b[k])  break;
      }
      if(k==26) printf("YES\n");
      else printf("NO\n");
  }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值