当前位置: 首页 > 后端技术 > Python

LeetCode3:无重复字符的最长子串

时间:2023-03-25 20:14:12 Python

题目:给定一个字符串,请找出最长无重复字符子串的长度。给定一个字符串,找到最长的没有重复字符的子串的长度。示例1:输入:"abcabcbb"输出:3解释:因为最长的无重复子串是"abc",它的长度为3。示例2:输入:"bbbbb"输出:1解释:因为最长的没有重复字符的子串是“b”,它的长度是1。例3:输入:“pwwkew”输出:3解释:因为最长的没有重复字符的子串是“wke”,它的长度是3。注意你的答案必须是子串,“pwke”是子序列,而不是子串。解题思路:暴力破解,时间复杂度为O(n^3),因为需要遍历所有字符,检查子串中是否有重复字符,通过滑动窗口,维护一个索引为[i,j),直接更新滑动窗口[i',j)为已有的字符i',需要保留每个字符值及其索引,即字符映射索引位置的hashmap:Key为字符值,Value为索引位置字符映射:ASCII码一共有128个字符,维护一个长度为128的整数数组,数组索引值映射128个字符,存储元素值为一个字符positionhashmap:Java:classSolution{publicintlengthOfLongestSubstring(Strings){char[]chars=s.toCharArray();//转换为字符数组if(chars.length==0)return0;HashMapmap=newHashMap<>();//构建哈希图intsize=s.length(),count=0,i=0;for(intj=0;jint:ifnots:return0hash_map=dict()#创建字典size=len(s)i,count=0,0forj,cinenumerate(s):#枚举字符ifcinhash_map:#ifinthemapping字符存在i=max(i,hash_map[c])#更新滑动窗口左边界icount=max(count,j-i)#更新count为最大值hash_map[c]=j+1#更新映射中的字符映射的值为当前位置加一returncount+1#返回最大累计总数,需要加1字符映射:Java:classSolution{publicintlengthOfLongestSubstring(Strings){char[]字符=s.toCharArray();如果(chars.length==0)返回0;int[]index=newint[128];//创建一个长度为128位的ASCII字符映射表intsize=s.length(),count=0,i=0;for(intj=0;jint:ifnots:return0size=len(s)i,count=0,0index=[0]*128#创建一个长度为128的ASCII字符映射bitsTableforj,cinenumerate(s):#枚举字符i=max(i,index[ord(c)])#更新滑动窗口的左边界icount=max(count,j-i)#更新计数tothemaximumValueindex[ord(c)]=j+1#更新map中字符的元素值给当前位置加一returncount+1#返回最大累计总数,因为Python需要加1没有字符概念,需要ord()函数转换成ASCII码欢迎关注微信。新工..公开。帐号:爱写Bug