Leetcode 刷题笔记:字符串篇

//结束了忙碌的期末,终于有了一个月的冬假,赶紧利用这段时间集中精力把Leetcode刷起来!

1.Leetcode344 反转字符串(题解

难度:⭐️

这道题目算是比较基础也是很简单的一道题目了,用双指针的方法可以轻松解决。时间复杂度O(N),空间复杂度O(1)具体代码

在反转链表中,使用了双指针的方法。

那么反转字符串依然是使用双指针的方法,只不过对于字符串的反转,其实要比链表简单一些。

因为字符串也是一种数组,所以元素在内存中是连续分布,这就决定了反转链表和反转字符串方式上还是有所差异的。

对于字符串,我们定义两个指针(也可以说是索引下标),一个从字符串前面,一个从字符串后面,两个指针同时向中间移动,并交换元素。

以字符串hello为例,过程如下:

 至于交换swap的实现,有三种方法:交换指针地址(本题不适用,因为要迭代)、交换数值(常用)、位运算。这里简单说一下位运算的实现:

Template<class T> void swap(T& x, T& y){

X^=y;

y^=x;

x^=y;

}

这里^是位异或运算符,A^A=0, 0^B=B。

最后提一下,本题仅需一行代码就能解决,即使用库函数reverse(s.begin(), s.end());然而这样做便失去了题目的精髓。本题就是让你自己实现一个reverse方法。

2.Leetcode541 反转字符串II(题解

难度:⭐️⭐️

这道题算是在上一题的基础上,加了一下判断和操作条件,需要以2k为区间,反转前k区间的字符串。一共需要O(n/2k)次循环,每次循环时完成反转需要O(k),因此总时间复杂度为O(n/2k)*O(k)=O(n),空间复杂度为O(1)

思路1:先定义一个变量来存储剩余元素个数,然后每次循环递减2k,同时对这个区间的前k个元素反转,最后循环结束后,判断一下剩余元素个数,如果小于k,只反转剩下的部分,反之反转前k个元素。具体代码

思路2:直接以2k区间大小来循环遍历,然后在循环函数体内判断2k区间实际包含的元素数量,如果小于k,则只反转开始位置到结束位置的字符,否则反转整个k区间。具体代码。(这样写虽然不用在循环结束后额外判断,但循环内需要多判断一次,相比思路1有利有弊)

官方题解的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值