leedcode刷题day2

题目:
leedcode刷题day2_第1张图片
根据这道题我的思路是用python首先将第一个值赋给a,然后将下一个值赋值给b在这里写一个循环计算下一个值是否等于a,不等于就进入数组当等于a的时候输出数组长度,然后比较数组长度输出最长长度对应的元素不过显然这很慢。
然后看了芦总的想法感觉还行不过我不知道用python怎么实现,因为他用的c++,然后是建立一个vector容器存放目前的最长子串,从第一个字符开始判断,如果字符不在子串中,则将字符插入,如果在,则从子串的第一个元素开始弹出,直到子串中没有重复字符时再进行插入。在出现重复字符时,表示目前子串长度是一个极大值,所以在开始弹出之前记录一次子串长度,并比较出最大的值。最后返回最大长度。
达89%也很不错~
我属实是啥啥都不行leedcode刷题day2_第2张图片

芦总的题解
我看到的一个题解大佬牛逼,比官方题解还清晰易懂不知道为啥官方题解总是给我一种很麻烦难懂的感觉~
leedcode刷题day2_第3张图片

这里面的(i - num)真的巧妙,以(i - 1)字符的第(n - 1)次出现的位置加1作为起始点检索i字符的(n - 1)次位置,找不到就加1,找到了就前后位置相减算出子串长度

class Solution {
    public int lengthOfLongestSubstring(String s) {
        int m = s.length();
        if(m==0){
            return 0;
        }
        int num = 1;
        int max = 1;
        for(int i=1;i<m;i++){
            int index = s.indexOf(s.charAt(i),i-num);
            if(index<i){
                num = i-index;
            }else{
                num = num+1;
            }
            max = Math.max(max,num);
        }
        return max;
    }
}

你可能感兴趣的:(leedcode,leetcode)