学习心得体会----最长无重复字符串(leetcode 算法题3)+刷题步骤

心得体会

每一次做题都是学习的过程。因为时间比较的赶,我是带有目的性的刷题。所以选择了HOT 100来刷。并且主要分为下面几个步骤:
1、看题+思考(花10-20分钟)
2、不管思考得出思考不出,我都会先去看一下其他人的题解,这里只看他们的思路,不看代码。
3、将自己的思路与比较好的思路结合了之后,开始着手编写代码
4、调试代码,这期间会发生很多错误,一次性成功的可能性几乎没有。有时候甚至要重新换个思路来编写代码。

就拿 求最长无重复字符串 举例:

Given a string, find the length of the longest substring without repeating characters.
Example 1:
Input: “abcabcbb”
Output: 3
Explanation: The answer is “abc”, with the length of 3.
Example 2:
Input: “bbbbb”
Output: 1
Explanation: The answer is “b”, with the length of 1.
Example 3:
Input: “pwwkew”
Output: 3
Explanation: The answer is “wke”, with the length of 3.
Note that the answer must be a substring, “pwke” is a subsequence and not a substring.
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

我第一次采用的就是评论里提到的“滑动窗口+hashmap”,采用的代码是提供的uthash库文件,结果最后产生了越界溢出错误。调试了很久也没找出问题。接着,第二次我将hashmap的代码改为128大小的数组,不再使用自带的函数。

int hashmap[128]={0};
if(hashmap[s[i]]=0)   代表已经访问过了,则将i= hashmap[s[i]];
	i = hashmap[s[i]];
else
	hashmap[s[i]] = i;  没访问过,则存储自己的下标
i++;

代码运行着是没问题,但超出了时间限制!

这时候我很纳闷,为什么两个看似是正确的代码就是死都运行不了呢?
无奈我不断的翻阅题解和评论。(C语言在题解和评论里出现的相对来说比较少,要找到高质量的也不简单)。终于看到了这个:
在这里插入图片描述
有点无敌的感觉。代码也非常的精炼,最主要的是完全用我之前未想到的思路去做。当时非常的兴奋。
这里他设置了两个标志位start和end并初始化为0;
接着初始化了一个256大小的字符数组为0;(扩展后的ASCII有256个)
ASCII码值完整可查

map[(int)*(s+start)]=1;  这里将s指向的第一个字符设为1
while(*(s+end) != 0)  起初我疑惑为什么不是'\0',最后翻了一圈在ASCII码值表看到0表示null。所以前面初始化数组需要用char来定义而不是用int,这样初始化的0是null而不是0
maxlen = maxlen >(end-start+1)?maxlen:(end-start+1); 这里end-start+1可以理解为窗口的大小
end++; 移动到下一个字符
 while(map[(int)*(s+end)] !=0){  不为0,就是说这个字符被访问过了,此时,我们将窗口start移动到窗口里与*(s+end)相同的元素之后;跳出循环;
            map[(int)*(s+start)] =0;
            start++;
        }
 map[(int)*(s+end)] = 1; 表示end已经访问过了

结果不出所料,十分的完美;
在这里插入图片描述

总结

这次还是学到了很多东西的,比如ascii码值的一些细节的东西。还学到了滑动窗口这个东西,虽然在计网里有有接触过这个,但这次更加深体会嘞。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值