Python programmers interview book --- problem-solving algorithm Summary: how string 5.12 Chapter 5 to determine whether a string contains repeating characters

# -*- coding: utf-8 -*-

'''
Python程序员面试算法宝典---解题总结: 第5章 字符串 5.12 如何判断一个字符串是否包含重复字符

题目:
判断一个字符串是否包含重复字符。例如: 'good'就包含重复字符'0',
而'abc'就不包含重复字符

分析:
可以用哈希数组,假设字符来自于ASCII码表的256个字符,
那么建立一个哈希数组,凡是出现的次数加1,一旦某个字符
出现次数超过1,即表示重复

关键:
1 书上解法
由于1个int可以有32bit,
可以用一个int整数上某1位bit是否为1来表示这个数是否存在;
可以申请8个int,每个int有32bit,共有8 * 32=256 bit
如果首次出现,就可以先用该整数 与 bit上数字进行或运算
即可
确定一个数字就用
num = ord(string[i])
index = num / 32
shift = num % 32
flags[index] & (1 << shift)

2 没有想到
是因为忘记bit位是否为1可以表示一个数字是否存在

参考:
Python程序员面试算法宝典
'''

def isStringHasRepeatedChar2(string):
    if not string:
        return False
    hashArray = [0 for i in range(256)]
    for char in string:
        index = ord(char)
        hashArray[index] += 1
        if hashArray[index] > 1:
            return True
    return False


def isStringHasRepeatedChar(string):
    if not string:
        return False
    hashArray = [0 for i in range(8)]
    for char in string:
        index = ord(char) / 32
        shift = ord(char) % 32
        result = hashArray[index] & (1 << shift)
        if result != 0:
            return True
        hashArray[index] |= (1 << shift)
    return False


def process():
    string = "good"
    result = isStringHasRepeatedChar(string)
    print result
    string = "abc"
    result = isStringHasRepeatedChar(string)
    print result


if __name__ == "__main__":
    process()

 

Guess you like

Origin blog.csdn.net/qingyuanluofeng/article/details/94543155