之前遇到过一个面试题,判断两个字符串(字符串仅有小写字母组成)是否包含的字母完全一样
比如 字符串1: staff 字符串2: fastf 就符合条件
当时看了 《The-Art-Of-Programming-By-July》
里面有介绍一种素数替换法
即将 a,b,c,d ...z 替换为素数 2,3,5,7 ...
分别求出两个字符串的素数乘积 然后比较是否相等即可
#!/usr/bin/env python # -*- coding:utf-8 -*- def get_res(string): bag = { 'a':2, 'b':3, ... 'z':101 } res = 1 for i in string: res = res * bag[i] return res def same_char(str1, str2): res1 = get_res(str1) res2 = get_res(str2) return res1 == res2
当时简单的说出了思想,事后想起来这样固然可以解决,却很容易面临乘积溢出的情况
今天看了《编程珠玑》,里面介绍了一种签名法
即可以将字符串1:staff 对应签名为 a1f2s1t1
字符串2 对应的签名为 a1f2s1t1
然后比较签名就可以判断出了
#!/usr/bin/env python # -*- coding:utf-8 -*- def get_sign(string): bag={} for i in string: if i in bag.keys(): bag[i] += 1 else: bag[i] = 1 res = "" for k in sorted(bag): res +='%s%s'%(k, bag[k]) return res def same_char(str1, str2): res1 = get_sign(str1) res2 = get_sign(str2) return res1 == res2
确实是一种比较好的算法