问题简介
其实本问题还是针对于数组的两层循环使用。
编程思路
程序
第一个版本
public int lengthOfLongestSubstring(String s) {
char[] chars = s.toCharArray();
// 每个子串的最大长度
int max = 0;
Set<Character> uniqueChars = new HashSet<>();
for (int i = 0; i < chars.length; i++) {
uniqueChars.add(chars[i]);
for (int j=i+1; j<chars.length; j++) {
if (!uniqueChars.contains(chars[j])) {
uniqueChars.add(chars[j]);
} else {
max = uniqueChars.size() > max ? uniqueChars.size() : max;
uniqueChars.clear();
}
}
}
return max;
}
这是由于未考虑边界情况。空串里面包含空格。
" "
AC版本
AC版本与之前版本的主要区别是内层循环中使用了break子句,这样语义明确下来,内层循环不断的处理不同字符串的追加,然后break跳出内层循环之后,最后进行max的最后的处理。
public int lengthOfLongestSubstring(String s) {
// 每个子串的最大长度
int max = 0;
Set<Character> uniqueChars = new HashSet<>();
for (int i = 0; i < s.length(); i++) {
uniqueChars.add(s.charAt(i));
for (int j=i+1; j<s.length(); j++) {
if (!uniqueChars.contains(s.charAt(j))) {
uniqueChars.add(s.charAt(j));
} else {
break;
}
}
max = uniqueChars.size() > max ? uniqueChars.size() : max;
uniqueChars.clear();
}
return max;
}
总结
其实这个题目并不复杂,主要考察的是数组的二维遍历,但是在使用过程中使用了String.charAt(index),自己整合了Set类型,因为可以方便的借助其包含功能,来实现无重复字符的最长子串的不断累加。
这个代码的功能其实与子串最大值与最小值的差有相似考察,还需要体会。