目录
🍕题目
🍔思路
我们分三步思考 边界确定———>移动规则————>计算长度,并记录,不断更新最长长度
1)我们使用一个左指针表示字符串中的某个子串(或窗口)的左边界,(右边界是在我们判断的下一个重复字符前一位)
2)在每一步的操作中,我们会将左指针向右移动一格,但需要保证这对应的子串中没有重复的字符。在python我们有内置函数set()函数来保证没有重复字符;
3)在移动结束后,这个子串长度就对应着 以左边界开始的到右边界的长度。我们记录下这个子串的长度;
在统计结束后,我们找到的最长的子串的长度即为答案。
🍟代码
class Solution: def lengthOfLongestSubstring(self, s: str) -> int: if not s: return 0 left = 0 nowset = set() n = len(s) max_len = 0 cur_len = 0 for i in range(n): cur_len += 1 while(s[i] in nowset): nowset.remove(s[left]) left += 1 cur_len -= 1 if cur_len > max_len:max_len=cur_len nowset.add(s[i]) return max_len
🍕题目
🍔思路:
题目中强调:
排列不会改变字符串中每个字符的个数,所以只有当两个字符串每个字符的个数均相等时,一个字符串才是另一个字符串的排列
也就是说:排列不讲究顺序,但是字符出现的 种类 和 次数 要恰好对应相等
我们用列表就存各自字母种类的 次数 计数
详细见我的代码
🍟代码
class Solution: def checkInclusion(self, s1: str, s2: str) -> bool: if len(s1)>len(s2):return False m,n = len(s1),len(s2) dic1 = [0]*26 dict2 = [0]*26 #第一步:初始化哈希表 for i in range(m): dic1[ord(s1[i])-ord("a")] += 1 #s1 dict2[ord(s2[i])-ord("a")] += 1 #s2 if dic1 == dict2: return True #滑动窗口更新哈希表 for i in range(m,n): #m到n的区间,不包含n dict2[ord(s2[i])-ord("a")] += 1 #进 dict2[ord(s2[i-m])-ord("a")] -= 1 #出 if dic1 == dict2: return True return False