本文主要是介绍UVa1339古老的密码题解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目
给你两个字符串,看你能不能将第一个字符变化位置(重排),变成和第二个字符串的26个字母一一对应。
解题思路:将两个字符串的各个字符的数量统计出来,如果各个字符串的数量都是一样的,那么就输出yes,否则输出no
题目分析
对题目整体进行分析,字母可以重新排列,所以字母的位置是不重要的,重要的是每个字母出现的次数,只需要将两个字符串每个字母出现的次数进行统计,然后排序一次比较字幕出现的次数是否相同,即可得出两个字符串是否可以互相变化。
代码
#include<stdio.h>
#include<string.h>
#include<memory.h>
void swap(int* a,int* b){//交换 int t;t=*a;*a=*b;*b=t;
}
int partition(int a[],int p,int q){//快速排序partition过程 int x=a[q];int i=p-1,j;for(j=p;j<q;j++){if(a[j]<x){swap(&a[++i],&a[j]);}}swap(&a[++i],&a[q]);return i;
}
void quicksort(int a[],int p,int q){//快速排序 int m=partition(a,p,q);quicksort(a,p,m-1);quicksort(a,m+1,q);
}
int main(){char a[105],b[105];//定义两个字符串 int countA[26],countB[26];//记录每一个字母出现的次数 memset(a,0,sizeof(a));memset(b,0,sizeof(b));while(scanf("%s%s",a,b)==2){memset(countA,0,sizeof(countA));memset(countB,0,sizeof(countB));int len=strlen(a);int i;for(i=0;i<len;i++){//统计每个字母出现的次数 countA[a[i]-'A']++;countB[b[i]-'A']++;}quicksort(countA,0,25);quicksort(countB,0,25);for(i=0;i<26;i++){//如果相应位置的字母出现的次数不同,尽管映射也不可能匹配 if(countA[i]!=countB[i]){break;}}if(i==26){//最终执行完循环没有退出,完全匹配 printf("yes");}else{printf("no");}}
}
这篇关于UVa1339古老的密码题解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!