这是我自己写的:
class Solution {
public int lengthOfLongestSubstring(String s) {
//如果s为空引用或者为空串。
if(s == null || s.length() == 0){
return 0;
}
//如果s的长度为1,那最长子串肯定是1
if(s != null && s.length() == 1) {
return 1;
}
//用来辅助检测s1里面是否有重复
HashMap<Character,Integer> hm = new HashMap<>();
//用来装子串的长度
ArrayList<Integer> al = new ArrayList<>();
//依次从最大到最小变化子串长度
for(int i = s.length(); i>=2; i--){
// 循环截取出所有长度为i的子串
for(int j = 0; j <= s.length()-i; j++){
String s1;
if(i == s.length()){
s1 = s;
} else {
// substring,from j position, lenth is i
s1 = s.substring(j, j+i);
}
// 开关法,标记下面这个for循环究竟有没有成功循环完。
boolean bl = true;
//遍历每一个字符,放入hm,来检测是否有重复。
for(int k = 0; k<=s1.length(); k++){
char c = s1.charAt(k);
if(!hm.containsKey(c)) {
hm.put(c, 0);
} else {
bl = false;
//s1不满足不重复字符条件,s1的长度是无效长度,干结束。break是结束当前整个for哦。
break;
}
}
if(bl){
al.add(s1.length());
};
}
}
if(al.size() == 0) {
return 1;
} else {
//使用默认排序
Collections.sort(al);
return al.get(0);
}
}
}
这是别人写的:
class Solution {
public int lengthOfLongestSubstring(String s) {
// 哈希集合,记录每个字符是否出现过
Set<Character> occ = new HashSet<Character>();
int n = s.length();
// 右指针,初始值为 -1,相当于我们在字符串的左边界的左侧,还没有开始移动
int rk = -1, ans = 0;
for (int i = 0; i < n; ++i) {
if (i != 0) {
// 左指针向右移动一格,移除一个字符
occ.remove(s.charAt(i - 1));
}
while (rk + 1 < n && !occ.contains(s.charAt(rk + 1))) {
// 不断地移动右指针
occ.add(s.charAt(rk + 1));
++rk;
}
// 第 i 到 rk 个字符是一个极长的无重复字符子串
ans = Math.max(ans, rk - i + 1);
}
return ans;
}
}