题目:给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
1、自己在短时间内能想出来的办法,有点乱
int lengthOfLongestSubstring(char * s){
int maxlen = 1, flag = 0, curlen = 1;
int len = strlen(s);
//空和1个字符的情况
if(len<2)
{
maxlen = len;
return maxlen;
}
//循环,从第一个字符开始 例 abcbac
for(int i=0; *(s+i) != '\0'; i++)
{
flag = 0;//标记是否找到重复的字符
//从上次找到重复字符的地方开始往下找 例 第二次循环从第二个b开始比较
for(int j=i+curlen; j<len; j++)
{
//i是开始比较的字符,j是最后的字符
for(int k=i; k<j; k++)
{
curlen = j-k;//现在没有重复的字符长度
maxlen = curlen>maxlen ? curlen:maxlen;
//与某个字符重复
if(s[j] == s[k])
{
flag = 1;//标记为1
curlen = j-i-1;//记录现在字符位置
break;
}
}
if(flag == 1)//找到重复后,不必再继续往下找
{
break;
}
}
//没有找到重复的,从i一直到最后都不重复,则表示之后的字符都不重复
if(flag == 0)
{
maxlen = (len-i)>maxlen ? (len-i):maxlen;
break;
}
}
return maxlen;
}
2、滑动窗口,无hash
int lengthOfLongestSubstring(char * s){
int start=0,end=0,maxlen=0,len = strlen(s);;
//空和1个字符的情况
if(len<2)
{
maxlen = len;
return maxlen;
}
while(end <= len)
{
int flag = 1;
for(int i=start; i<end; i++)//检查中间是否有重复的
{
if(s[i] == s[end])//如果重复了
{ flag = 0;
if((end-start)>maxlen)//查看长度
{
maxlen = end-start;
}
start = i+1;//调整start位置
break;
}
}
if(flag == 1 && (end-start)>maxlen)
{
maxlen = end-start;
}
end++;
}
return maxlen;
}
3、利用hash记录重复字符的位置
大致可以理解为只要遇到与前面重复的字符就进行滑动,并且改变当前字符最后位置的记录。
int lengthOfLongestSubstring(char * s){
int maxlen=0,start=0,cur=0,i=0,index[128]={0};//index为hash记录字符位置,初始为0
for(i=0; *(s+i)!='\0'; i++)
{
if(index[s[i]] > start)
{
cur = i-start;
if(cur>maxlen)
{
maxlen = cur;
}
start = index[s[i]];//起始位置改变
}
index[s[i]] = i+1;//记录字符位置+1
}
cur = i-start;
if(cur>maxlen)
{
maxlen = cur;
}
return maxlen;
}
Python:
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
start = 0
maxlen = 0
HashTable={}
for i,element in enumerate(s):#
if((element) in HashTable and HashTable[element] > start):# 如果遇到重复的字符
if(i-start > maxlen):
maxlen = i-start
start = HashTable[element] # 改变开始计算的位置
HashTable[element] = i+1 # 字符的位置+1存入HashTable:{'element':i+1}
if(len(s) - start) > maxlen:
maxlen = len(s) - start
return maxlen