输入: “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
输入: “bbbbb” 输出: 1 解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
输入: “pwwkew” 输出: 3 解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。 请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
public int lengthOfLongestSubstring(String s) { int l = s.length();//字符串长度 if (l == 0 || s == null) {//长度为零或为空直接返回 0 return 0; }else if (l == 1) {//长度为1直接返回1 return 1; }else if(l == 2){//长度为2 if(s.charAt(0) == s.charAt(1)){//相同值返回1 return 1; }else{//不相同返回2 return 2; } }else{//长度大于2的情况 Map<Character,Integer> set = new HashMap<Character, Integer>(); int bian = 3;//相同子串的位置 int q = 0;//有相同子串时会产生变量 int e = 0;//不符合条件时会产生变量 for (int i = 0; i < l; i++){ set.put(s.charAt(i),0); if(set.size() != i + 1 - q){//找到相同变量 if(q == 0){ bian = i;//第一个变量的位置 } q++;//变量 } int s2 = set.size(); if(s2 != 1 && s2 != 2 && s2 != bian){//该字符串不符合条件 e++; break; } } if(e == 0) {//符合条件的字符串直接返回se int se = set.size(); if (se == 1 || se == 2 || se == l || bian == se) { return se; } } int length = 0;//最短子串长度变量 int min = 0;//相同字符位置 int c = 0;//找到的不重复子串的每一个长度变量 int p = 0;//相同字符的个数 int g = 0;//控制set的范围 set = new HashMap<Character, Integer>(); Set set1 = new HashSet<Character>(); for(int i = 0; i < l; i++){ set1.add(s.charAt(i)); int s1 = set1.size(); if(s1 != i+1 - p){ if(set.get(s.charAt(i)) >= g){//找到相同子串 min = set.get(s.charAt(i))+1; c = i+1 - min; g = min - 1; }else{ c = i + 1 - min; } p++; set.put(s.charAt(i),i); }else{ c = i + 1 - min; set.put(s.charAt(i),i); } if(length < c){ length = c; } } return length; } }