1.滑动窗口
1.1第3题-无重复字符的最长子串
给定一个字符串 s
,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc"
,所以其长度为 3。
心得:用哈希表来一点点遍历,但是因为哈希表占内存,我又是两个循环遍历,所以速度又慢,占的内存还多。
class Solution(object):
def lengthOfLongestSubstring(self, s):
"""
:type s: str
:rtype: int
"""
if len(s)==0:
return 0
max_ = 1
for i in range(len(s)):
hash_table = {}
max_temp = 0
for j in range(i,len(s)):
if s[j] not in hash_table:
hash_table[s[j]] = 1
max_temp += 1
if max_ < max_temp:
max_ = max_temp
else:
break
return max_
看了解析,我的整体思路差不多,不过他用了滑动窗口,计算量少了很多 ,而且一开始没有理解left的含义,left是用来从窗口的左边开始删除元素,直到哈希表中没有相同的元素为止。还有就是用set()不要用{},set需要使用add和remove。
class Solution(object):
def lengthOfLongestSubstring(self, s):
"""
:type s: str
:rtype: int
"""
if len(s)==0:
return 0
max_len = 0
hash_table = set()
cur_len = 0
left = 0
for j in range(len(s)):
cur_len += 1
while s[j] in hash_table:
hash_table.remove(s[left])
left += 1
cur_len -= 1
if max_len < cur_len:
max_len = cur_len
hash_table.add(s[j])
return max_len
1.2第438题-找到字符串中所有字符异位词
给定两个字符串 s
和 p
,找到 s
中所有 p
的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。
异位词 指由相同字母重排列形成的字符串(包括相同的字符串)。
示例 1:
输入: s = "cbaebabacd", p = "abc" 输出: [0,6] 解释: 起始索引等于 0 的子串是 "cba", 它是 "abc" 的异位词。 起始索引等于 6 的子串是 "bac", 它是 "abc" 的异位词。
心得:思路很简单,早早的就想出来了,但是关于滑动窗口与给定字符串相等的逻辑却想了半天,最终决定用字典来记录,重复出现的字符就对字典中该字符的值加一,滑动的时候删除或减一。字典删除的操作使用del。
参考答案中是用数组来存储每个字母的个数
class Solution(object):
def findAnagrams(self, s, p):
"""
:type s: str
:type p: str
:rtype: List[int]
"""
if len(s) < len(p):
return []
elif s == p:
return [0]
target_dict = {}
n = len(p)
for i in range(n):
if p[i] not in target_dict:
target_dict[p[i]] = 1
else:
target_dict[p[i]] = target_dict[p[i]] + 1
result = []
result_dict = {}
for i in range(n-1):
if s[i] not in result_dict:
result_dict[s[i]] = 1
else:
result_dict[s[i]] = result_dict[s[i]] + 1
for i in range(len(s)-n+1):
if s[i+n-1] not in result_dict:
result_dict[s[i+n-1]] = 1
else:
result_dict[s[i+n-1]] = result_dict[s[i+n-1]] + 1
if result_dict == target_dict:
result.append(i)
if result_dict[s[i]] == 1:
del result_dict[s[i]]
else:
result_dict[s[i]] = result_dict[s[i]] - 1
return result