459. 重复子字符串(Python)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了459. 重复子字符串(Python)相关的知识,希望对你有一定的参考价值。
参考技术A 难度:★☆☆☆☆类型:数组
给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。
示例 1:
输入: "abab"
输出: True
解释: 可由子字符串 "ab" 重复两次构成。
示例 2:
输入: "aba"
输出: False
示例 3:
输入: "abcabcabcabc"
输出: True
解释: 可由子字符串 "abc" 重复四次构成。 (或者子字符串 "abcabc" 重复两次构成。)
这里我们观察到一个现象,对于一个字符串s,我们将两个该字符串连接成一个更长的字符串(s_double),该字符串中至少包含两个s子串,如果s可以由多个重复单元构成,那么合并后的字符串中一定包含超过两个s子串(可重叠),例如,两个"abab"组成的"abababab"中包含3个"abab",而两个"aba"组成的"abaaba"则只包含两个"aba",根据这个原理,我们只需要统计s+s中s(可重叠)出现的次数,并与2比较即可。
这里为了简化计算,我们把s+s的首尾两端字符去掉,这样就只需要查看s是否在剩余的字符串中即可。编码时通过索引范围[1:len(s)*2-1]起到去掉首尾两端字符的效果。
如有疑问或建议,欢迎评论区留言~
python实现无重复字符串的最长子串
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其
长度为 3。
示例 2:
输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b"
,所以其长度为 1。
示例 3:
输入: "pwwkew" 输出: 3 解释: 因为无重复字符的最长子串是"wke"
,所以其长度为 3。 请注意,你的答案必须是 子串 的长度,"pwke"
是一个子序列,不是子串。
def lengthOfLongestSubstring(s): """ :type s: str :rtype: int """ # 存储历史循环中最长的子串长度 max_len = 0 # 判断传入的字符串是否为空 if s is None or len(s) == 0: return max_len # 定义一个字典,存储不重复的字符和字符所在的下标 str_dict = {} # 存储每次循环中最长的子串长度 one_max = 0 # 记录最近重复字符所在的位置+1 start = 0 for i in range(len(s)): # 判断当前字符是否在字典中和当前字符的下标是否大于等于最近重复字符的所在位置 if s[i] in str_dict and str_dict[s[i]] >= start: # 记录当前字符的值+1 start = str_dict[s[i]] + 1 # print start # 在此次循环中,最大的不重复子串的长度 one_max = i - start + 1 # 把当前位置覆盖字典中的位置 str_dict[s[i]] = i # 比较此次循环的最大不重复子串长度和历史循环最大不重复子串长度 max_len = max(max_len, one_max) return max_len print lengthOfLongestSubstring(‘pwwssffasdf‘)
这里的解题思路是把字符串中的值当做字典的key,把他对应的索引存为字典的value。通过取出的值跟最开始计数的值进行比较找出最大值。
以上是关于459. 重复子字符串(Python)的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode 459. 重复的子字符串(Repeated Substring Pattern)