【字符串】最长不含重复字符的子字符串【暴力法太蠢,动态规划学不好,双指针了解一下】

最长不含重复字符的子字符串【双指针】

字符串一个经典的问题:求最长不含重复字符的子字符串,举例如下:
例如,在”abcabcbb”中,其无重复字符的最长子字符串是”abc”,其长度为 3;
又如,”bbbbb”,其无重复字符的最长子字符串为”b”,长度为1。

暴力法会产生三四个for循环,算法的复杂度太高不可取;那么,用动态规划吗?听着好高端,还没学习过的童鞋肿么办?木有门槛低一点好理解一点的方法么?哈哈,双指针了解一下。代码如下:

public class LongestSubStr {
  public static String getLongestSubStr(String str){
    if(str == null || str.length() <= 1){
      return str;
    }
    String subMax = new String(str.substring(0,1));//默认就字符串第一个字符吧
    HashSet<Character> set = new HashSet<>();//过滤重复内容,我想到了HashSet过滤
    int p1 = 0;
    int p2 = 1;
    while (p2 < str.length()){
      String sub = str.substring(p1, p2+1);//把这一段丢到set里,有木有更快点的方法?脑子不够用额
      for(int i = 0; i < sub.length(); i++){
        set.add(sub.charAt(i));
      }
      //这句话判断当前[p1, p2]位置的子字符串是否满足要求
      if(set.size() != sub.length()){
        //sub有重复:指针同时右移直到移出有重复区域
        p1++;
        p2++;
      }else{
        //sub没有重复:sub满足要求,更新subMax,只p2右移,看有没有更大的子字符串
        //可以看出,如果有多个同等长度的子字符串,我们的方法中不会去一直更新,而是仅仅记录了第一个符合条件的子字符串。
        subMax = sub;
        p2++;
        set.clear();
      }
    }

    return subMax;
  }

  public static void main(String[] args) {
    String str = "abcabcbb";
    System.out.println(getLongestSubStr(str));
  }

}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值