LeetCode3.最长无重复子串/阿里面试题手写代码(2018春招实习)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Lollipop66/article/details/79902883

给定一个字符串,找出不含有重复字符的 最长子串 的长度。

示例:

给定 "abcabcbb" ,没有重复字符的最长子串是 "abc" ,那么长度就是3。

给定 "bbbbb" ,最长的子串就是 "b" ,长度是1。

给定 "pwwkew" ,最长子串是 "wke" ,长度是3。请注意答案必须是一个子串"pwke" 是 子序列 而不是子串。


详解:这个题其实很简单,但是之前也是因为自己基础比较差,阿里一面就挂在了这个题上,想想自己真的太low了!主要是自己对java的一些基本方法或者属性不太了解(说多了都是理由)

(不知道这是不是最优,后面有利用set进行优化)

这里面定义一个变量first,用他来表示当前子串的第一个字符,count去计数,max去统计当前最大长度。index表示当前的字符,判断他与子串是否重复。

class Solution {
    public int lengthOfLongestSubstring(String s) {
        int len = s.length();
int max = 0;
int count =1;
int first = 0;
        if(len==1)
            return 1;
for(int i =1;i<len;i++){
char ch = s.charAt(i);
int index = s.indexOf(ch,first);
if(index==i){  //判断当前字符是不是与当前子串有重复的字符,这种情况是无重复
count++;
max = Math.max(count, max);
}
else{  // 这种情况是有重复的子串,这时将从重复的字符的下一个字符进行重新计数,count要变成1
max = Math.max(count, max);
count = 1;
first = index+1;
i = first;
}
}
return max;
    }
}


优化:利用滑动窗口的方法进行优化,j不断向其中添加,当j有重复,i就删去一个元素,然后重新迭代。

(其实仍然可以继续优化,就是删掉重复位置以及重复之前的所有字符,将i移动到重复字符的后一个位置即可)

class Solution {
    public int lengthOfLongestSubstring(String s) {
        int len = s.length();
int max  =0;
Set<Character> ch = new HashSet<Character>();
for(int i =0,j=0;i<len&&j<len;){
if(!ch.contains(s.charAt(j))){
ch.add(s.charAt(j));
j++;
max = Math.max(max, j-i);
}
else{
ch.remove(s.charAt(i));
i++;
}
}
return max;
    }
}

猜你喜欢

转载自blog.csdn.net/Lollipop66/article/details/79902883
今日推荐