题目描述:
请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。
示例 1:
输入: “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例 2:
输入: “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
示例 3:
输入: “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。
提示:
s.length <= 40000
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/zui-chang-bu-han-zhong-fu-zi-fu-de-zi-zi-fu-chuan-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路:
方法一: 暴力,这个题目第一眼看到,最简单的解法就是可以利用集合来,此处我最开始想到的是使用List来做,大概需要跑两次循环,时间复杂度O(n²)。因为每次都会去new一个List,所以空间复杂度也很高。不建议此方法。
此方法,就是挨着遍历字符串中每个元素,找他的最大不重复子串,若下一个不重复就list.add(该元素),若重复,则说明这个子串最长就这样,我们就需要跳出内层循环,然后list的长度和之前得到的最长长度比较,进行更新。
方法二: 看评论区有很多使用滑动窗口、dp解决,我先思考一下,稍后进行补充。
代码:
public class jianzhi_Offer_48 {
//暴力
public int lengthOfLongestSubstring(String s) {
if (s.length() == 0){
return 0;
}
int maxnum = 1;
for (int i = 0; i < s.length(); i++) {
ArrayList list = new ArrayList();
for (int j = i; j < s.length(); j++) {
if (list.contains(s.charAt(j)) == false) {
list.add(s.charAt(j));
}
else {
break;
}
}
maxnum = Math.max(maxnum,list.size());
}
return maxnum;
}
public static void main(String[] args) {
jianzhi_Offer_48 obj = new jianzhi_Offer_48();
System.out.println(obj.lengthOfLongestSubstring("au"));
}
}

该博客介绍了如何使用滑动窗口算法解决LeetCode中的「最长不包含重复字符的子字符串」问题。作者首先提出了暴力解法,即通过两层循环和集合来检查每个字符是否重复,但这种方法效率低下。接着,作者转向了滑动窗口方法,通过维护一个窗口并移动其边界来找到最长无重复字符的子串,大大提高了时间复杂度。代码实现中,作者使用了一个变量记录最长长度,并在窗口内遇到重复字符时更新窗口位置。这种方法在空间和时间上都更为高效。
1011

被折叠的 条评论
为什么被折叠?



