算法杂记

之前遇到过一个面试题,判断两个字符串(字符串仅有小写字母组成)是否包含的字母完全一样
比如 字符串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

确实是一种比较好的算法

转载于:https://www.cnblogs.com/nixiaocang/p/6487203.html

你可能感兴趣的:(python)