[LeetCode] Longest substring without repeated characters

本文介绍了一种求解字符串中最长无重复字符子串长度的高效算法。通过使用数组记录字符最后出现的位置,实现从前向后的扫描过程,并在遇到重复字符时更新起始位置。文章提供了详细的代码实现及注意事项。
这题的idea就是从前往后扫,用个hashtable(其实是数组)把上次出现过的位置记下来,遇到出现过的,就从上次出现过的地方开始往下算。 具体实现细节对于新手还是有些坑,比如我刚开始就觉得从新的start开始扫的话,要把hashtable重新initialize,但实际上加一个条件就能避免。另外最长substring出现在最后也有点费思量。还有hashtable要initialize 为-1等也需要注意。 

public class Solution {
   public int lengthOfLongestSubstring(String s) {
      int start = 0, max = 0;
      int [] last = new int[256];  
      Arrays.fill(last, -1); //initialize as -1, since 0 is also a valid position. 
      for (int i = 0; i < s.length(); i++){
         int c = s.charAt(i);
         if (last[c] >= start){  //with this check, you don't need to count the appreance again. 
            max = Math.max(max, i - start);
            start = last[c] + 1;
         }
         last[c] = i;
      }
      max = Math.max(max, s.length() - start);  //don't forget the last character, like "abcd"
      return max;
   }

}














评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值