一、题目还原
题目:给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例 2:
输入: “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
示例 3
输入: “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
*请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。
二、解题思路
① 判断空,如果为空,则直接返回0
② 判断单个字符,如果为单个字符,包含空格之类的,直接返回1
③ 将字符串转换成List集合进行遍历,定义起始下标start,定义最大长度maxLength,记录每次的最大子串maxStr,依次判断当前每个字符是否包含于最大子串中,如果包含,则记录子串重复值开始之后的子串加当前字符组成新的子串,最大长度取当前子串长度与最大长度的最大值,以此类推继续遍历判断;如果不包含直接用最大子串加上当前字符
三、代码展示
① main函数
public static void main(String[] args) {
String s = "abcabcbb";
System.out.println("最大子串长度为 == "+lengthOfLongestSubstring(s));
}
② lengthOfLongestSubstring方法函数
public static int lengthOfLongestSubstring(String s) {
//最长子串
String maxStr = "";
//最大长度
int maxLength = 0;
//判空
if("".equals(s) || null == s || s.length() == 0){
return 0;
}
//将字符串转换成数组集合
List<String> list = Arrays.asList(s.split(""));
if(null != list && list.size() > 1){
for(int start = 0 ; start < list.size() ; start ++){
if(maxStr.indexOf(list.get(start)) > -1){
maxLength = maxLength > maxStr.length() ? maxLength : maxStr.length();
//取最大子串重复值开始之后的子串加当前字符组成新的子串
maxStr = maxStr + list.get(start);
maxStr = maxStr.substring(maxStr.indexOf(list.get(start))+1,maxStr.length());
//System.out.println("maxStr == "+maxStr);
}else {
maxStr = maxStr + list.get(start);
}
System.out.println(start+" == "+maxStr);
}
}else if(list.size() == 1){
return 1;
}
return maxLength > maxStr.length() ? maxLength : maxStr.length();
}
控制台输出:
0 == a
1 == ab
2 == abc
3 == bca
4 == cab
5 == abc
6 == cb
7 == b
最大子串长度为 == 3
四、自我总结
刚拿到题目的时候以为很简单,急匆匆的写好代码通过最简单的测试用例直接就提交,每次根据不同的测试用例所报的错误一个个解决,提交了9次最终成功。
但是从【执行时间】和【内存消耗】两个指标来看,此代码质量不高,后期博主也会仔细研究一下大佬们是如何写出优质代码的。
博主给大家一个小建议,答题的时候可以在自己的IDE中建一个项目进行编码,这样一来变量名拼写错误可以一目了然看出,自动填补也很方便,其次就是调试起来十分方便。