leetcode-03-无重复字符的最长字串

动态规划
3. 无重复字符的最长子串
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
[a,b,c,d,b,e] =4

	a			b			c 			d			b			e

设置left和right分别为起点和终点。看看【left,right】是否有重复的字符
当Left是a时,移动right指针。到right索引为4时,发现和前面的b相同。之前的串已经包括了。设置变量maxofsub,此时记录maxofsub=4。
移动Left指针,把b从subString子串中剔除出去,因为就算是计算,从Left=b,到写一个b的子串的长度还是比4小。
移动Left指针到c,b出去,c之后的b可以进来了。直到看完所有的字符。

现在的问题是怎么判断substring的字符已经是被访问过的。

用一个方法去判断
boolean[128] used。里面默认的时false
max=0;

推导一下过程:
①:不移动left指针,而是移动right指针
a b c d b e
f f f f f
T T T T F
在b的时候更新max的结果=max(max,right-left)

第二次移动left指针移位,并且移动right指针
left此时指的是a,和①的b没有重复
left向下指,此时为b

class Solution {
    public int lengthOfLongestSubstring(String s) {
        if(s==null||s.length()==0) return 0;
        //定义一个左指针和右指针
        int left=0,right=0;
        int n=s.length();//获得字符串的长度
        //注意,因为是基本数据类型,所以used数组索引的值默认是false
        boolean[] used=new boolean[128];
        int max=0;
        while(right<n){
            //charAt()方法用于返回指定索引处的字符
            if(used[s.charAt(right)]==false){
                used[s.charAt(right)]=true;
                right++;
            }
            else{
                max=Math.max(max,right-left);
                while(left<right&&s.charAt(right)!=s.charAt(left)){
                    used[s.charAt(left)]=false;
                    left++;
                }
                left++;
                right++;
            }
        }
        max=Math.max(max,right-left);
        return max;
    }
}

跑出来的结果还是稍微差了点,第一次刷leetcode,感谢basketwangcoding提供算法思路

有空的话,我还会多看看的leetcode评论区的题解,并且优化代码。谢谢~~~~~~

发布了16 篇原创文章 · 获赞 0 · 访问量 230

猜你喜欢

转载自blog.csdn.net/weixin_44110100/article/details/105474971