Python程序员面试算法宝典---解题总结: 第5章 字符串 5.16 求一个串中出现的第一个最长重复子串

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

'''
Python程序员面试算法宝典---解题总结: 第5章 字符串 5.16 求一个串中出现的第一个最长重复子串

题目:
给定一个字符串,找出这个字符串中最长的重复子串,比如给定字符串"banana",
子字符串"ana"出现2次,因此最长的重复子串为"ana"

分析:
看到字符串要想到trie树。
看到"最长/小/优"要想到: 贪心,动态规划,广度优先搜索
最简单的方法就是求出所有子串的组合,对每个子串,
去字符串中搜索,统计每个子串的出现次数。

关键:
1 书上解法
后缀数组,先求出字符串的后缀数组。然后对后缀数组排序,
然后求相邻两个后缀数组的公共子串的长度。
排序直接用sort方法

string[0: maxLen]
中不可以取到string[maxLen]这个字符

2 之所以没有想到
是因为忘记后缀数组可以用来求最长重复子串问题

参考:
Python程序员面试算法宝典
'''
def getLen(str1, str2):
    if not str1 or not str2:
        return 0
    len1 = len(str1)
    len2 = len(str2)
    count = 0
    i = 0
    while i < len1 and i < len2:
        if str1[i] == str2[i]:
            count += 1
        else:
            break
        i += 1
    return count

def getLongestDuplicaedSubStr(string):
    if not string:
        return
    size = len(string)
    suffixStrs = [string[i:] for i in range(0, sizes)]
    # 对后缀数组排序
    suffixStrs.sort()
    # 计算相邻后缀字符串的最长公共子串的长度
    maxLen = 0
    maxStr = 0
    for i in range(1, size):
        lenValue = getLen(suffixStrs[i-1], suffixStrs[i])
        if lenValue > maxLen:
            maxLen = lenValue
            maxStr = suffixStrs[i-1][0: maxLen]
    return maxLen, maxStr


def process():
    string = "banana"
    maxLen, maxStr = getLongestDuplicaedSubStr(string)
    print maxLen
    print maxStr


if __name__ == "__main__":
    process()

 

你可能感兴趣的:(Python程序员面试算法宝典)