无重复字符的最长子串代码实现
上代码:
方法一(HashMap集合实现):
public static int get(String s) { // 判断字符串是否为空 if(s.length() == 0){ return 0; } // 定义left指针 int left= 0; // 定义最大容量 int max = 0; // 定义一个map,作为一个滑动窗口 HashMap<Character, Integer> map = new HashMap<>(); // 遍历字符串 for (int i = 0; i < s.length(); i++) { // 是否有重复的元素,如果有重复元素,变化left指针,没有继续执行 // 1.只要重复则必须要与原来的left比大小,判断更新left指针 // 2.map.get(s.charAt(i)) 获得的是重复元素在map中left的指针 +1是因为i是从0开始的 // 3.left的更新与个数有关系 if(map.containsKey(s.charAt(i))){ left = Math.max(left,map.get(s.charAt(i))+1); } // 重复的字符key,直接会将其覆盖,但下标(Integer)会进行更新 map.put(s.charAt(i),i); // 更新max的最大值,比大小看是否要进行覆盖 max = Math.max(max,i - left + 1); } // 返回个数 return max; }
方法二(好理解的Set集合实现):
public static int getNumSet(String s){ int j = 0; int maxLength = 0; // 创建一个set集合 Set<Character> set = new HashSet<>(); for (int i = 0; i < s.length(); i++) { // 判断是否包含这个元素,不包含添加,并更新maxLength, // 包含将此元素以及此元素之前的元素全部在set结合中删除 if (!set.contains(s.charAt(i))){ // 添加 set.add(s.charAt(i)); maxLength = Math.max(maxLength,set.size()); }else{ while (set.contains(s.charAt(i))){ set.remove(s.charAt(j)); j++; } // 添加 set.add(s.charAt(i)); } } return maxLength; }
HashMap版(不建议用,运行耗内存,value值没用到):
public static int getNumMap(String s){ int left = 0; int maxLength = 0; HashMap<Character, Integer> map = new HashMap<>(); for (int i = 0; i < s.length(); i++) { if(!map.containsKey(s.charAt(i))){ map.put(s.charAt(i),i); maxLength = Math.max(maxLength,map.size()); }else { while(map.containsKey(s.charAt(i))){ map.remove(s.charAt(left)); left++; } map.put(s.charAt(i),i); } } return maxLength; }