[leetcode]No.3无重复字符的最长子串

该问题是一个编程挑战,要求找到字符串中不包含重复字符的最长子串长度。解决方案使用了C++,通过unordered_set(哈希集合)来存储已出现的字符并检测重复项,双重循环结构用于遍历所有可能的子串。时间复杂度为O(n)。代码对编程初学者友好,但仍有优化空间。
摘要由CSDN通过智能技术生成

题目


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

来源:力扣(LeetCode)

链接:https://leetcode.cn/problems/longest-substring-without-repeating-characters

输入输出样例


示例 1:

输入: s = "abcabcbb"

输出: 3

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

示例 2:

输入: s = "bbbbb"

输出: 1

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

示例 3:

输入: s = "pwwkew"

输出: 3

解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。

请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

题解


先上代码,本题采用C++语言编写,涉及的内容主要有:unordered_set(hash集合),多循环判断。

    int lengthOfLongestSubstring(string s) {
        int i = 0,j = 0,temp=0;
        //循环所需变量以及求最大值时所需的temp交换变量
        while(i!=s.size()){
            unordered_set<char> occ;
            //设置s.size次循环,在每个循环中定义一次hash集合
            int num = 0;
            //num变量用于记录子串长度
            for(j=i;j<s.size();++j){
                if(occ.count(s[j])>0){
                    break;
                }
                //判断hash集合中的该元素个数,大于零意味着重复,跳出循环
                occ.insert(s[j]);
                //将元素添加到hash集合中
                num++;        
            }
            i++;
            if(num>temp){
                temp=num;
            }
            //判断与交换变量大小来求最大值
        }
        
    return temp;
    }

分析


主要思路:主体两次循环。第一个循环是num的次数,num的次数应为子串的可能出现的长度,例如s="abcd",子串可能的长度为1、2、3、4,故num为4;第二个循环是遍历字符串,并将元素添加到hash集合中。

时间复杂度:O()

总结


本人是编程小白,还未系统的学习过算法,代码还有很大改进的空间,欢迎大家批评与建议,但是我觉得对于像我一样的编程小白来说,还是很通俗易懂的,希望能有所帮助!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值