今天逛脉脉,在上面看到一个求字符串中不含重复字符的最长子串,如果突然看到这个题,当时真的是写不出,更何况最优解了,这个题以前出去面试的时候被考到过,当时也没有写出来,所以在网上看了这道题的答案后自己试着写了下,并将自己的理解记录下来
总体思路:
1.设置两个游标,一左一右,刚开始都设置成0,设置一个set,用来存放不含重复字符串的子字符串;
2.从零的位置开始遍历字符串,如果set里面不含这个字符就将这个字符放入set中,右游标右移一位,通过左右游标获取最长的字符串,最后一次出现的就是所求的不重复最长子字符串
3.如果遍历的字符已经存在set中了,那就启动左游标,找到重复字符第一次出现的位置,在寻找的过程中,将重复字符第一次出现的位置之前的字符都去掉,只到找到将重复字符第一次出现的位置后,再启动右游标开始扩充
public static int getMaxLength(String str){
int length = str.length();
int i=0;//右游标
int j=0;//左游标
int maxLength = 0;
//用于存储不重复的字符
HashSet<String> hashSet = new HashSet<>();
while(i<length&&j<length){
String end = str.substring(i,i+1);
/**
* 当字符没有重复的时候,右游标i往右前进一位
*/
if(!hashSet.contains(end)){
hashSet.add(end);
i++;
if(i-j>maxLength){
maxLength = i-j;
System.out.println("最大子字符串:"+str.substring(j,i));
}
}else{
/**
* 当字符串有重复的时候,就得找到重复字符第一个出现的位置,
* 并将左游标j移到重复字符第一个出现的位置后面一位,
* 然后再来扩展右游标
*/
String start = str.substring(j,j+1);
hashSet.remove(start);
j++;
}
}
return maxLength;
}
public static void main(String[] args) throws Exception {
int maxlengtn = getMaxLength("abcabcbbqwertykokj");
System.out.println("最长长度是:"+maxlengtn);
}
输出结果:
最大子字符串:a
最大子字符串:ab
最大子字符串:abc
最大子字符串:bqwe
最大子字符串:bqwer
最大子字符串:bqwert
最大子字符串:bqwerty
最大子字符串:bqwertyk
最大子字符串:bqwertyko
最长长度是:9