POJ 2159

水题,实际上是让统计各个字符串中每个字母出现的频率,将频率用两组数组记录,每个数组响应的位置全都相等,那么密码是正确加密的。

思路的参考,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;
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值