水题,实际上是让统计各个字符串中每个字母出现的频率,将频率用两组数组记录,每个数组响应的位置全都相等,那么密码是正确加密的。
思路的参考,http://blog.csdn.net/lyy289065406/article/details/6642586和
对于string和和char之间的转化,用到了指针:http://blog.csdn.net/cnmilan/article/details/7744091。
涉及的知识点:排序(qsort() )、指针、stdlib库的应用(memset()函数)等。
//用指针指向string类的对象
#include<iostream>
#include<string>
using namespace std;
int main(void)
{
string s = "hello"; //定义一个char类型指针,把string s的首元素地址赋给pt,则pt指向字符串s.
char *pt = &s[0];
cout << pt << endl;
return 0;
}
下面是我写程序,但是一直WA.
#include<iostream>
#include<cstdlib>
#include<string>
using namespace std;
int Compare(const void *ele1, const void *ele2)
{
return *((int *)(ele1)) - *((int *)(ele2));
}
int main( )
{
bool boo;
string original,secret; //定义两个字符串,用来做输入
char *pto = &original[0]; //让指针指向string对象original字符串的首地址
char *pts = &secret[0]; //同上
memset(pto,0,sizeof(original)); //为新申请的内存做初始化
memset(pts,0,sizeof(secret) );
cin>>original>>secret;
qsort(pto, original.size(), sizeof(char), Compare); //将字符串中的字符按照ASCII码排序。升降无关 qsort(pts, secret.size(), sizeof(char), Compare); int count1=0,count2=0,num1[26]={0},num2[26]={0}; if(original.size()==secret.size()){ //统计字符的频率 for(int i=0;i<original.size();i++){ if(original[i]=original[i+1]){ num1[count1]++; }else count1++; if(secret[i] = secret[i+1]){ num2[count2]++; }else count2++; };
int *ptn1 = &num1[0]; int *ptn2 = &num2[0];
qsort(pto, original.size(), sizeof(char), Compare); qsort(pts, secret.size(), sizeof(char), Compare);
for(int cont =0; cont<=count1;cont++){ //检查密码是否正确
if(num1[cont]!=num2[cont]){
cout<<"NO "<<endl; return 0; }else cout<<"YES"<<endl; } } return 0; } 上面的这个程序,一直WA。没考虑特殊情况。就在刚才,发现存在个大问题:
就是记录频率的数组最后对应的位置数组是不一样的。有一个不一样,就可能发生错误。
#include <iostream>
#include <algorithm> #include <string> using namespace std; int main() { string str1,str2; int origin[26] = {0},des[26] = {0}; //两个数组,记录字母的频率 cin>>str1>>str2; if (str1.length() != str2.length()) //特殊情况,当两组字符长度不一致,直接输出NO,返回(必须要有返回) { cout<<"NO"<<endl; return 1; } for(int i =0; i < str1.length(); i++) //记录字符串中字母频率,数组的下标采用字母和字符A的ASCII码的差值,正好是在26个字母表中的位置 { origin[str1[i] - 'A']++; des[str2[i] - 'A']++; } sort(origin, origin+26); //对得到的频率记录表进行排序,这样数组每个位置对应数据,0在一边 sort(des,des+26); if(0 == memcmp(origin,des,26*sizeof(int))) { cout<<"YES"<<endl; //对得到的频率数组进行匹配,如果相同输出YES,不同输出NO,返回1 } else { cout<<"NO"<<endl; } return 1; }