求字符串中不含重复字符的最长子串

今天逛脉脉,在上面看到一个求字符串中不含重复字符的最长子串,如果突然看到这个题,当时真的是写不出,更何况最优解了,这个题以前出去面试的时候被考到过,当时也没有写出来,所以在网上看了这道题的答案后自己试着写了下,并将自己的理解记录下来
  总体思路:

 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

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值