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 0max_ = 1for i in range(len(s)):hash_table = {}max_temp = 0for j in range(i,len(s)):if s[j] not in hash_table:hash_table[s[j]] = 1max_temp += 1if max_ < max_temp:max_ = max_tempelse:breakreturn max_
看了解析,我的整体思路差不多,不过他用了滑动窗口,计算量少了很多 ,而且一开始没有理解left的含义,left是用来从窗口的左边开始删除元素,直到哈希表中没有相同的元素为止。还有就是用set()不要用{},set需要使用add和remove。
class Solution(object):def lengthOfLongestSubstring(self, s):""":type s: str:rtype: int"""if len(s)==0:return 0max_len = 0hash_table = set()cur_len = 0left = 0for j in range(len(s)):cur_len += 1while s[j] in hash_table:hash_table.remove(s[left])left += 1cur_len -= 1if max_len < cur_len:max_len = cur_lenhash_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]] = 1else:target_dict[p[i]] = target_dict[p[i]] + 1result = []result_dict = {}for i in range(n-1):if s[i] not in result_dict:result_dict[s[i]] = 1else:result_dict[s[i]] = result_dict[s[i]] + 1for i in range(len(s)-n+1):if s[i+n-1] not in result_dict:result_dict[s[i+n-1]] = 1else:result_dict[s[i+n-1]] = result_dict[s[i+n-1]] + 1if 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]] - 1return result