一道腾讯面试题

题目描述:

假设两个字符串中所含有的字符和个数都相同我们就叫这两个字符串匹配,比如:abcda和adabc,由于出现的字符个数都是相同,只是顺序不同,所以这两个字符串是匹配的。要求高效!

我的解法是借用 异或运算,在长度相同的情况下,对所有的字符进行累积异或,由异或的性质,相同的数异或为0,异或满足交换律。时间只有O(n)

代码如下:

  1. /************************************************************************/  
  2. /*  
  3.  
  4.   假设两个字符串中所含有的字符和个数都相同我们就叫这两个字符串匹配, 
  5.   比如:abcda和adabc,由于出现的字符个数都是相同,只是顺序不同, 
  6.  所以这两个字符串是匹配的。要求高效! 
  7.                                                                      */  
  8. /************************************************************************/  
  9.   
  10. #include <IOSTREAM>   
  11. #include <string>   
  12. #include <ASSERT.H>   
  13. using namespace std;  
  14.   
  15. bool isStrMatching(const char* str1,const char* str2)  
  16. {  
  17.     assert( str1!=NULL && str2!=NULL);  
  18.       
  19.     int len1=strlen(str1);  
  20.     int len2=strlen(str2);  
  21.   
  22.     if( len1 != len2 )  
  23.         return false;  
  24.   
  25.     int flag=0,i=0;  
  26.       
  27.     for(;i<len1;i++)  
  28.         flag^=( str1[i]^str2[i] );  
  29.       
  30.     return (flag==0);  
  31. }  
  32.   
  33. void main()  
  34. {  
  35.     char str1[]="abcda";  
  36.     char str2[]="adabc";  
  37.   
  38.     if( isStrMatching(str1,str2) )  
  39.         cout<<"yes.\n";  
  40.     else  
  41.         cout<<"no.\n";  
  42. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值