3. 无重复字符的最长子串-力扣(LeetCode)

文章讨论了如何使用Python和Java编程语言解决一个字符串问题,即找到一个给定字符串中无重复字符的最长子串的长度。通过滑动窗口和双指针策略,结合集合数据结构来实现高效的解决方案。
摘要由CSDN通过智能技术生成

基础知识要求:

java:方法、集合、字符串、泛型、if else语句、while循环、Math类、逻辑运算符

python: 方法、集合、字符串、if else语句、while循环、max()、逻辑运算符

题目:

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

示例 1:

输入: s = "abcabcbb"
输出: 3 
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

示例 2:

输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。

示例 3:

输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
     请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

提示:

  • 0 <= s.length <= 5 * 104
  • s 由英文字母、数字、符号和空格组成 

Python代码示例:

def lengthOfLongestSubstring(s: str) -> int:  
    # 如果字符串为空,则无重复字符的最长子串长度为0  
    if not s:    
        return 0    
  
    # 初始化左指针和右指针,都指向字符串的起始位置  
    left = 0    
    right = 0    
  
    # 使用集合来存储当前窗口内的字符,方便快速查找  
    char_set = set()    
  
    # 初始化最长无重复字符子串的长度为0  
    maxLength = 0    
  
    # 当右指针没有超出字符串长度时,继续遍历  
    while right < len(s):    
        # 尝试扩展右边界  
        # 如果当前字符不在集合中,说明没有重复,可以加入集合  
        if s[right] not in char_set:    
            char_set.add(s[right])    
  
            # 更新最长无重复字符子串的长度  
            maxLength = max(maxLength, right - left + 1)    
  
            # 右指针向右移动一位  
            right += 1    
        else:  
            # 如果当前字符已经在集合中,说明出现了重复  
            # 需要收缩左边界,即将左指针指向的字符从集合中移除  
            # 直到重复字符不再出现在集合中  
            # 出现重复字符,收缩左边界  
            while s[left] in char_set:  
                char_set.remove(s[left])  
                left += 1  
  
            # 因为已经处理了重复字符,所以右指针可以继续向右移动  
            # 简单来说,这行代码就是每次遍历到一个新的字符时,
            #都检查当前窗口是否比已知的最长无重复字符子串还要长,
            #如果是的话,就更新 maxLength 的值。
            right += 1  
  
    # 遍历结束后,返回最长无重复字符子串的长度  
    return maxLength    
  
# 示例测试  
s = "abcabcbb"    
print(lengthOfLongestSubstring(s))  
# 输出: 3 
 # 最长无重复字符子串为"abc"  
  
s = "bbbbb"    
print(lengthOfLongestSubstring(s)) 
 # 输出: 1  
# 最长无重复字符子串为"b"  
  
s = "pwwkew"    
print(lengthOfLongestSubstring(s))  
# 输出: 3 
 # 最长无重复字符子串为"wke"

这段Python代码实现了寻找给定字符串中最长无重复字符子串的长度。它使用滑动窗口的方法,通过左右两个指针来定义窗口范围,并利用集合快速判断字符是否重复。当遇到重复字符时,移动左指针收缩窗口,直到重复字符不再出现。最终,返回遍历过程中记录的最长无重复字符子串的长度。 

Java代码示例:

public class LongestSubstringWithoutRepeatingCharacters {  
  
    /**  
     * 计算给定字符串中不含重复字符的最长子串的长度。  
     *  
     * @param s 给定的字符串  
     * @return 不含重复字符的最长子串的长度  
     */  
    public static int lengthOfLongestSubstring(String s) {  
  
        // 如果字符串为空或长度为0,则直接返回0  
        if (s == null || s.length() == 0) {  
            return 0;  
        }  
  
        // 初始化左指针和右指针,都指向字符串的起始位置  
        int left = 0;  
        int right = 0;  
  
        // 初始化最长无重复字符子串的长度为0  
        int maxLength = 0;  
  
        // 使用HashSet存储当前窗口内的字符,以便快速查找  
        Set<Character> charSet = new HashSet<>();  
  
        // 当右指针没有超出字符串长度时,继续遍历  
        while (right < s.length()) {  
            // 尝试将右指针的字符加入集合  
            if (!charSet.contains(s.charAt(right))) {  
                // 如果字符不在集合中,说明没有重复,加入集合  
                charSet.add(s.charAt(right));  
  
                // 更新最长无重复字符子串的长度  
                maxLength = Math.max(maxLength, right - left + 1);  
  
                // 右指针向右移动一位  
                right++;  
            } else {  
                // 如果字符已经在集合中,说明出现了重复  
                // 移除左指针的字符,并将左指针向右移动一位  
                charSet.remove(s.charAt(left));  
                left++;  
            }  
        }  
  
        // 遍历结束后,返回最长无重复字符子串的长度  
        return maxLength;  
    }  
  
    /**  
     * 主函数,用于测试 lengthOfLongestSubstring 方法。  
     *  
     * @param args 命令行参数  
     */  
    public static void main(String[] args) {  
        // 测试用例1  
        String s = "abcabcbb";  
        System.out.println(lengthOfLongestSubstring(s)); 
        // 输出: 3  
  
        // 测试用例2  
        s = "bbbbb";  
        System.out.println(lengthOfLongestSubstring(s)); 
        // 输出: 1  
  
        // 测试用例3  
        s = "pwwkew";  
        System.out.println(lengthOfLongestSubstring(s)); 
        // 输出: 3  
    }  
}

 这段Java代码定义了一个LongestSubstringWithoutRepeatingCharacters类,其中包含了一个静态方法lengthOfLongestSubstring,用于计算一个字符串中不含重复字符的最长子串的长度。同时,还有一个main方法用于测试这个功能。

lengthOfLongestSubstring方法中,使用了双指针技巧来维护一个滑动窗口,窗口内的字符都是不重复的。通过不断移动右指针来扩展窗口,当遇到重复字符时,就移动左指针来缩小窗口,直到重复字符不再出现。同时,使用了一个HashSet来快速判断字符是否存在于当前窗口中。

main方法中,提供了三个测试用例来验证lengthOfLongestSubstring方法的正确性。

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千小凡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值