LeetCode 打卡 Day5

昨天爬香山可真是翠绿啊😭,没见着漫山的红叶倒是把腿爬废了。周末两天就快过了,临时兴起继续打打LeetCode的卡吧

今天第三题:无重复字符的最长子串

今天开始会将完整的题目贴上来,完整题目如下:

看着这个题目,脑子里隐隐感觉大二上算法课好像有个算法就是解决这个问题的,但目前也就想起这么点东西了。打卡开始........(希望多刷刷题能帮我多想起来一点算法知识)

1、方法一:自己脑子里想的,不涉及任何算法知识的解法

看到题目的第一时间,我的脑子里想到的是,在遍历字符串的过程中计算从每一位(用start标识)开始不重复的最长子串,在这个过程中不断对比更新最长子串的长度。时间复杂度O(n2)。

在编码测试的过程中发现了一个容易踩坑的小点:当出现连续的相同字符时,需要将遍历的字符串下标复位到start,否则会出现跳过相同字符,导致结果出错。

代码用java编程,完整代码如下:

class Solution {
    public int lengthOfLongestSubstring(String s) {
        int l = s.length();
        int max = 0;
        int start = 0;
        boolean flag = false;
        for(int i=0; i<l; i++){
            flag = false;
            char a = s.charAt(i);
            for(int j = start; j<i; j++){
                char b = s.charAt(j);
                if(a==b){
                    flag = true;
                    break;
                }
            }
            if(flag){   //出现重复
                i=start;
                start+=1;
            }else{      //未出现重复
                int len = i-start+1;
                max = max>len?max:len;
            }
        }
        return max;
    }
}

2、方法2:解答区观摩大佬答案(学算法)

滑动窗口:看完官方的解答后,总结出以下几个重点思路

1)首先是一个算法思路:当已经确定i到j无重复字符时,而i与j+1重复,那么其实已知 i+1 到j是无重复的,就这一点足够将时间复杂度从O(n2)降低到O(n)了。

2)之后是一个编程思路:看到“不重复”三个字应该联想到集合(set)数据结构的,引入集合后,编码难度大幅度下降啊。

依上述思路完整代码实现如下(使用C++):

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int l = s.size();
        unordered_set<char> sub;
        int end = 0,start = 0;      //左右指针位置
        int max=0;
        for(end=0; end<l; end++){
            if(!sub.count(s[end])){     //当前字符不重复
                sub.insert(s[end]);
                max = max>(sub.size())?max:(sub.size());
            }
            else{                       //当前字符重复
                max = max>(sub.size())?max:(sub.size());
                sub.erase(s[start]);
                start++;
                end--;
            }
        }
        return max;
    }
};

感觉依旧不是最优解啊,有时间看看大佬都是怎么搞的吧。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
打开leetcode Leetcode | 算法刷题 算法学习: 由于Leetcode题量大,内容多,复习难度大,学习掌握算法的情况也不是很好。 从8.28开始转刷剑指offer,一共67道题目,其中简单题7道,中等难度题31道,较难题26道,困难题3道 1: 简单题和中等难度题(共38道题目) 2: 最优解,做笔记 3: 每天2道,隔天复习(即每天4道题) 4: Python 每日打卡: 8月: 28:1⃣剑指offer刷题 29:1⃣剑指offer刷题 30:1⃣剑指offer刷题2⃣博客网站布局搭建完毕 8月 28 29 30 31 . . . 1h练字/阅读 :check_box_with_check: :check_box_with_check: :check_box_with_check: :check_box_with_check: :cross_mark: :cross_mark: :cross_mark: 2+2算法题 :check_box_with_check: :check_box_with_check: :check_box_with_check: :check_box_with_check: :cross_mark: :cross_mark: :cross_mark: 博客网站 :check_box_with_check: :check_box_with_check: :check_box_with_check: :check_box_with_check: :cross_mark: :cross_mark: :cross_mark: 毕业课题 :cross_mark: :cross_mark: :check_box_with_check: :check_box_with_check: :cross_mark: :cross_mark: :cross_mark: 认真投入学习 9月第一周 1 2 3 4 5 6 7 1h练字/阅读 :check_box_with_check: :check_box_with_check: :cross_mark: :check_box_with_check: - - - 2+2算法题 :check_box_with_check: :check_box_with_check: :cross_mark: :check_box_with_check: - - - 博客网站 :check_box_with_check: :check_box_with_check: :check_box_with_check: :check_box_with_check: :cross_mark: :cross_mark: :cross_mark: 毕业课题 :cross_mark: :cross_mark: :cross_mark: :cross_mark: :cross_mark: :cross_mark: :cross_mark: 1号:

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值