Day14 代码随想录刷题记录

总结:

刷题5题。没花多少时间,核心也在于保持手感。但是对于双指针的运用其实是显得有些陌生的。对于字符串的理解有待加强。

459.重复的子字符串

自己的想法:

先使用getNext函数获取字符串的next数组的值,偶遇因为重复字符串的next数组呈现出特殊趋势,所以直接判断next数组的特殊趋势即可。

错误解析:

上述的运用kmp来解决问题的思路是正确的,但是判断的逻辑错误。(原代码还有边界的问题,注意for循环中问题的边界)。

 for(int i = 0;i < s.size() - 1;i ++){

            if(next[i] > 0 && next[i] + 1 != next[i + 1])

                return false;//如果不符合条件直接退出

        }

这样判断没有涉及到判断重复字符串的本质,还是在讨巧地找规律,大概有1/3的样例都是不通过的。

判断的kmp板子中的getNext函数是原封不动出现的,这个板子背下来即可。

正确的做法:

明确在此求“最长前后缀公共长度”中,不包含的字串就是最小重复的字符串。

根据该思路来做题即可求解。 求出next最后一个值,即代表最长前后缀公共长度,拿总长度减去该值就可以得到重复的长度,再通过取余的操作来判断字符串是否符合条件。

27. 移除元素

自己的想法:

采用数组的相关的做法,使用add和remove函数?vector数组本身有啥函数吗?

想到大概率要用到双指针,但是双指针具体如何实现也忘记了。。。只能够大概想到用i和j来记录数组中对应的元素的值。

正确的做法:

快指针和慢指针的使用。

本质上还是要回归到对于暴力解法的理解,因为暴力解法就是套两层循环(一旦遇到不符合条件的值就批量移动数组)来解决问题,但是这样做的时间复杂度不行。于是擦用快慢指针的思路一次完成

设置快指针寻找符合条件的值,设置慢指针更新符合条件的值的下标。

344.反转字符串

自己的想法:

设置一前一后两个指针,循环实现交换的操作。直到两个指针相遇为止。

思路正确,解答完成。

541. 反转字符串II

自己的想法:

也是根据字符串的特点,设置一快一慢两个指针来进行操作。

慢指针负责反转字符串,快指针负责一次跳跃2k个单位。

“最后的字符剩余的部分要怎么处理呢?如果剩余少于k个。则全部反转;如果小于2k但是大于k,前k个值也得照常反转。”

这个怎么处理?

正确的做法:

在倒转字符串的时候使用双指针来操作,不要使用其他的方法干扰翻转。

处理字符串剩余的部分的核心在于求得一个字符串翻转的最小值。

替换数字

自己的想法:

做过的题目,看到了其实还是没有立刻就反映出思路,对于问题解决的熟悉度还不够。

核心在于,新的数组的长度与原数组不同了,所以要有重新设定长度的过程。

没有设立额外的字符串空间,但是思路值得借鉴。新的字符串长度定下来后,直接从旧字符串的尾部开始将相关值赋给后方;如果不为数字则正常赋值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值