leetcode-3 Longest Substring Without Repeating Characters经典的动态规划问题

思路:
首先从第一个字符开始往后计数,每次发现一个字符就这个字符出现的位置改成现在的位置,即map的val值是当前的位置
这个时候我们开始计数的位置还是0 即 j=0,

一旦我们往后不断更新最大的不重复子字符串的长度的时候,
第一个重复的字符出现了,
那么这个时候我们就要更新开始的位置了,
因为什么呢,因为我们的字符串里不能包含两个相同的字符,

这个时候要做的就是将字符开始的位置搬运到这个重复字符第一次出现的位置之后的那个位置上就可以了。

而我们怎么更新这个字符最新出现的位置呢?

在判断重复之后更新 最大的起始位置 起始位置只能大 不能小

Math.max(int a ,int b) :取最大值 ,包含边界值

public class Solution {
    public int lengthOfLongestSubstring(String s) {
      if(s.length()==0) return 0;
      int max=0;
      HashMap<Character,Integer> map=new HashMap<>();

      for(int i=0,j=0;i<s.length();++i)
      {
          if(map.containsKey(s.charAt(i)))
          {
              j=Math.max(j,map.get(s.charAt(i))+1);
              //  j用来表示下次开始查长度的起点
            //第一个重复的字符出现了,那么这个时候我们就要更新开始的位置了
          }
          map.put(s.charAt(i),i);
          max=Math.max(max,i-j+1);
      }
      return max;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值