(补)代码随想录算法训练有营DAY9|Leetcode 151、卡码网55

文章链接:代码随想录

151.翻转字符串里的单词 + 卡码网:55.右旋转字符串 

视频链接:字符串复杂操作拿捏了! | LeetCode:151.翻转字符串里的单词_哔哩哔哩_bilibili

一刷先跳过KMP算法了,先把字符串的其他基础题过一遍。

总体来说,由于python字符串处理特性和一些库函数的存在,用python做字符串题的难度要小于讲解中的C++。但是重要的是掌握解题思路,注意写代码时的逻辑细节问题。

另外,需要再次强调的是:在Python中字符串是不可变的,不能像操作列表或字典那样,直接对字符串的某个位置上的字符进行赋值。例如,反转字符串类的题目需要将其转换成列表,然后通过join()函数再将其转换成列表,因此无法实现空间复杂度为O(1)的要求

151.翻转字符串里的单词

状态:有思路,同时看了视频讲解,理解了按照要求“不要使用辅助空间,空间复杂度要求为O(1)”的情况下该如何解题

思路:

按照“拆分-反转-合并”的思路来做:

        1)拆分可直接使用split()函数,在此过程中直接将字符串中多余空格的问题一并处理了

        2)反转可以直接用切片,也可以用双指针法分别从头尾两端进行单词的前后替换

        3)合并就是用 “(一个空格)”.join()实现

总结:

1. 看文字讲解中的另一种思路是:先删除空白,然后整个反转,最后单词反转。首先删除字符串的前后空白,用的是strip()函数;整个反转使用的是切片;单词反转是将反转后的字符串进行split()拆分再反转单词

2. 要求“不要使用辅助空间,空间复杂度要求为O(1)”时的解题思路(参考代码随想录文字讲解)

  • 移除多余空格 ==>>类似数组中的“移除元素”解法,快慢指针思想
  • 将整个字符串反转  ==>> 同leetcode344 reverse()函数双指针思想,从头尾两端进行字符反转
  • 将每个单词反转  ==>> 还是reverse()函数,遇到空格说明单词结束

3. 时间复杂度O(n), 空间复杂度O(n)

class Solution:
    def reverseWords(self, s: str) -> str:
        lst = s.split()
        
        # 双指针思想,也可直接使用切片lst[::-1]
        left, right = 0, len(lst) - 1        
        while left < right:
            lst[left], lst[right] = lst[right], lst[left]
            left += 1
            right -= 1
        return ' '.join(lst)

卡码网:55.右旋转字符串

状态&思路:按照python的写法,直接使用切片即可

总结:

1. 要求“不能申请额外空间,只能在本串上操作”的思路,移步==>>右旋字符串 | 代码随想录

k = int(input())
s = input()

s = s[len(s)-k:] + s[:len(s)-k]
print(s)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值