Pythonプログラマインタビューブック---問題解決のアルゴリズムの概要:第5章では、どのように二つの文字列間の関係を決定するために、文字列5.5が含まれています

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

'''
Python程序员面试算法宝典---解题总结: 第5章 字符串 5.5 如何判断两个字符串的包含关系

题目:
给定由字母组成的字符串s1和s2,其中,s2中字母的个数少于s1,如何判断s1是否包含
s2? 即出现在s2中的字符在s1中都存在。
例如s1="abcdef", s2="acf",那么s1就包含s2;
如果s1="abcdef", s2="acg",那么s1就不包含s2,因为s2
中有'g',但是s1中没有'g'

分析:
最简单的方法,还是用刚才的哈希数组,
先对字符串1中每个字符进行哈希,
然后对于字符串2中的每个字符判断其在哈希数组中如果不存在,
则不是包含关系

关键:
1 注意需要自己对数组长短进行判断
入参不一定是按照长字符串,短字符串的顺序

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

def isContained(str1, str2):
    if not (str1 and str2):
        return False
    len1 = len(str1)
    len2 = len(str2)
    if len1 > len2:
        bigStr = str1
        smallStr = str2
    else:
        bigStr = str2
        smallStr = str1
    size = 256
    hashArray = [0 for i in range(size)]
    for char in bigStr:
        index = ord(char) - ord('0')
        if index >= size:
            return False
        hashArray[index] += 1
    for char in smallStr:
        index = ord(char) - ord('0')
        if index >= size:
            return False
        if 0 == hashArray[index]:
            return False
    return True


def process():
    str1 = 'abcdef'
    str2 = 'acf'
    result = isContained(str1, str2)
    print result
    str2 = 'acg'
    result = isContained(str1, str2)
    print result
    str2 = 'abcdef'
    str1 = 'acf'
    result = isContained(str1, str2)
    print result


if __name__ == "__main__":
    process()

 

おすすめ

転載: blog.csdn.net/qingyuanluofeng/article/details/94305574