Leetcode刷题Python子数组查找

Posted Better Bench

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Leetcode刷题Python子数组查找相关的知识,希望对你有一定的参考价值。

深信服公司的算法笔试题

1 题目

一个重复字符串是由两个相同的字符串首尾拼接而成,例如abcabc便是长度为6的一个重复字符串,而abcba则不存在重复字符串。
给定任意字符串,请帮小强找出其中的最长重复子串。
示例

输入
“ababc”
输出
4
说明
abab为最长的重复字符子串,长度为4

2 解析

子串问题一般都是用滑动窗口解决,这里就是一个典型的例子,

  • 我们先将字符串从中间分开,看成两个连续的窗口,最大窗口的长度是字符串长度的一半,函数比较窗口中的内容是否相等,如果相等,返回true,此时的最长重复子串长度等于一个窗口的长度的两倍,即2*i;否则继续移动窗口,移动步数的边界是字符串长度减去此时的两个窗口长度;
  • 在这一层窗口长度中找不到重复子串则缩小窗口长度,重复步骤2,直到窗口长度缩小至0,循环结束

3 Python 实现

def solve(s):
    if s=='':
         return 0
    mid=int(len(s)/2)
    # 记录窗口长度
    res=0
    # 窗口长度最长为一半,且不断减小
    for i in range(mid,-1,-1):
        # j不仅控制着窗口内容的比较,而且控制着窗口的移动,窗口移动的边界条件是字符串长度减去当前的一个窗口长度
        for j in range(len(s)-i):
            # 比较两个窗口中的字符                                    
            if s[j]==s[j+i]:
                res+=1
            # 一旦出现一个字符不相等时,窗口长度置0,从下一个字符开始遍历
            else:
            	res=0;
            # 当结果等于当前一个窗口的长度时,返回窗口长度的两倍
            if res==i:
                return 2*i
    return 0
print(solve(str(input())))

以上是关于Leetcode刷题Python子数组查找的主要内容,如果未能解决你的问题,请参考以下文章

Leetcode刷题Python718. 最长重复子数组

Leetcode刷题Python300. 最长递增子序列

Leetcode刷题Python剑指 Offer 04. 二维数组中的查找

Leetcode刷题Python34. 在排序数组中查找元素的第一个和最后一个位置(二分查找)

Leetcode刷题日记精选例题(附代码及链接)

Leetcode刷题Python704. 二分查找