leetcode 无重复字符的最长子串 C,Python

题目:给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。

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

猜你喜欢

转载自blog.csdn.net/mxxxkuku/article/details/107985360