Uva1339

题目地址:

https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=832&page=show_problem&problem=4085

题意说明:

就是给两个字符串如"JWPUDJSTVP"和 "VICTORIOUS",能否通过将前一个字符串做映射:每个字母变换为另一个字母(该字母可以与原始的字母重复但是与其他字母的映射字母不相同);以及重排得到另一个字符串。

  • 例如对字符串"JWPUDJSTVP"做映射:得“IVOTCIRSUO”然后再重排可以得到“VICTORIOUS”。
  • 例如“AAA”可以全部映射为“AAA”,因为字符串只有一个相同字母“A”所以映射可以全部取重复的。
  • 又例如“HEHE”可以映射为“HAHA”也可以映射为“BEBE”......但是你不能将“HEHE”映射为“HHHH”因为映射发生了重复。

本题的关键在于怎么模拟这种转换,第一种容易想到的方法就是直接模拟这种字母的映射,但是题目所说的映射方式并没有明确给出,所以说并不好模拟,故不可取。第二种方法就是采用紫书上的排序(说实话我第一次看到这题看不懂刘老爷子在说什么),其实很好理解:就是第一个字符串如果有一个字母出现了n次,那么第二个字符串中一定也会有一个字母出现n次,因为第二个字符串由第一个映射而来。那么我们对两个字符串每个字母出现次数进行排序得到两个数组,如果这两个数组一样,就说明是符合条件的。

代码

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
char s1[110],s2[110];
int n1[26],n2[26];

using namespace std;
int main(){
    while(scanf("%s%s",s1,s2)!=EOF){
        memset(n1, 0, sizeof(n1));
        memset(n2, 0, sizeof(n2));
        int len = strlen(s1);
        
        for(int i=0; i<len; i++)
        {
            n1[s1[i]-'A']++;
            n2[s2[i]-'A']++;
        }
        //ÅÅÐò 
        sort(n1, n1+26);
        sort(n2, n2+26);
        
        bool ok = true;
        for(int i = 0;i < 26;i++){
            if(n1[i]!=n2[i]){
                ok = false;
                break;
            }
        }
        if(ok) printf("YES\n");
        else printf("NO\n");    
    }   
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/Western-Trail/p/8934614.html