转载

LeetCode:给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。【Solution1】

原文链接:https://blog.csdn.net/weixin_43724845/

刷题神器:LeetCode官方网站

一、题目还原

题目:给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 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中建一个项目进行编码,这样一来变量名拼写错误可以一目了然看出,自动填补也很方便,其次就是调试起来十分方便。

正文到此结束