美文网首页
3. 无重复字符的最长子串

3. 无重复字符的最长子串

作者: calm_peng | 来源:发表于2018-11-14 23:51 被阅读0次
image.png
// /*
// 暴力法:简单易懂,但是时间复杂度太高O(n^3),会超时间。需要注意点是边界。规定好[i,j).
// */

// public class Solution{
//  public int lengthOfLongestSubstring(String s){  
//      int n = s.length();
//      int ans = 0;

//      for(int i = 0;i<n;i++){
//          for(int j = i+1;j<n+1;j++){
//              if(allUnique(s,i,j)) 
//                  ans = Math.max(ans,j-i);
//          }


//      }

//      return ans;
//  }


//  public boolean allUnique(String s,int start ,int end){
//      Set<Character> set = new HashSet<>();
//      for(int i = start;i<end;i++){
//          Character ch = s.charAt(i);
//          if(set.contains(ch)) return false;
//          set.add(ch);
//      }
//      return true;
//  }

// }



/*
滑动窗口:
在暴力法中,如果,sij为不重复子序列 j每次加一 时 会的重复遍历i到j-1的每一个
这样复杂度会降到O(n^2).
通过使用 HashSet 作为滑动窗口,我们可以用O(1) 完成对字符是否
在当前的子字符串中。
*/


// public class Solution{
//  public int lengthOfLongestSubstring(String s){
//      int n = s.length();
//      Set<Character> set = new HashSet<>();
//      int ans = 0,i = 0,j = 0;

//      while(i<n && j<n){
//          if(!set.contains(s.charAt(j))){
//              set.add(s.charAt(j));
//              j++;
//              ans = Math.max(ans,j-i);
//          }else{
//              set.remove(s.charAt(i));
//              i++;
//          }


//      }
//      return ans;

//  }


// }




/*
优化的滑动窗口:
利用HashMap的key的唯一性,来判断是否,已经重复。
将value 存放下一次的,开始的地址,j+1


*/

public class Solution{
    public int lengthOfLongestSubstring(String s){
        int n = s.length(), ans = 0;
        Map<Character,Integer> map = new HashMap<>();

        for(int i = 0,j = 0;j < n; j++){
            if(map.containsKey(s.charAt(j))){
                i = Math.max(map.get(s.charAt(j)),i);
            }
            ans = Math.max(ans,j-i+1);
            map.put(s.charAt(j), j+1);

        }
        return ans;

    }
}


leetcode

相关文章

网友评论

      本文标题:3. 无重复字符的最长子串

      本文链接:https://www.haomeiwen.com/subject/aixefqtx.html