day 7 | 字符串 (补3.14)

目录

344.反转字符串

题目描述:

题解:

题解:灵神

541. 反转字符串II

题目描述:

题解一:真就是无脑双指针

题解二:官方解法总是显得我很蠢的样子

151 反转字符串中的单词

题目描述:

题解一:collections.deque

题解二:内置s.split()

459 重复的子字符​​​​​​​

题目描述:

题解一:枚举

题解二:移动匹配


344.反转字符串

题目描述:

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。

不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。

题解:

class Solution:
    def reverseString(self, s: List[str]) -> None:
        """
        Do not return anything, modify s in-place instead.
        """
        l = len(s)
        left, right = 0, l - 1
        while left < right:
            # temp = s[left]
            # s[left] = s[right]
            # s[right] = temp
            # 注意python可以直接互换:
            s[left], s[right] = s[right], s[left]
            left += 1
            right -= 1 
        return s

题解:灵神

class Solution:
    def reverseString(self, s: List[str]) -> None:
        for i in range(len(s) // 2):
            s[i], s[-i - 1] = s[-i - 1], s[i]

    def reverseString(self, s: List[str]) -> None:
        # s[:] = s[::-1] 是切片赋值语法,表示用 s[::-1] 替换 s 中的元素。
        # 注意不能写成 s = s[::-1],因为 s 只是一个局部变量,
        # 对它的修改不会影响到函数外部传入的实际参数。
        s[:] = s[::-1]

# 作者:灵茶山艾府

541. 反转字符串II

题目描述:

题解一:真就是无脑双指针

这道题突出了我对切片一无所知

class Solution:
    def reverseStr(self, s: str, k: int) -> str:
        l = len(s)
        s = list(s)
        left, right = 0, 2*k - 1
        while right < l:
            # 注意是前面k个元素反转,不是两个啊
            # s[left], s[left + 1] = s[left + 1], s[left]
            # 在反转前k个元素时,您使用了错误的切片范围。应该将 s[left:left+k-1] 修改为 s[left:left+k]
            # s[left:left+k-1] = s[left:left+k-1:-1]
            s[left:left+k] = s[left:left+k][::-1]
            left = right + 1
            right += 2*k
        #注意
        # if left + 1 < l and left + k - 1 >= l - 1:
        #     s[left:] = s[left:][::-1]
        # elif left + 1 < l and left + k - 1 < l - 1:
        #     s[left:left+k] = s[left:left+k][::-1]
        if left < l:
            s[left:left+k] = s[left:left+k][::-1]
        # return str(s) -> "['a']"
        return ''.join(s)

题解二:官方解法总是显得我很蠢的样子

class Solution:
    def reverseStr(self, s: str, k: int) -> str:
        t = list(s)
        for i in range(0, len(s), 2*k):
            t[i:i+k] = reversed(t[i:i+k])
        return ''.join(t)

151 反转字符串中的单词

题目描述:

给你一个字符串 s ,请你反转字符串中 单词 的顺序。

单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。

返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。

注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。

题解一:collections.deque

class Solution:
    def reverseWords(self, s: str) -> str:
        l = len(s)
        left, right = 0, l-1
        while left <= right:
            if s[left] == ' ':
                left += 1
            if s[right] == ' ':
                right -= 1
            if s[left] != ' ' and s[right] != ' ':
                break
        que = collections.deque()
        cur_word = []
        while left <= right:
            if s[left] != ' ':
                cur_word.append(s[left])
            elif cur_word:
                que.appendleft(''.join(cur_word))
                cur_word = []
            left += 1
        #注意最后一个单词要加上
        que.appendleft(''.join(cur_word))
        return ' '.join(que)

题解二:内置s.split()

class Solution:
    def reverseWords(self, s: str) -> str:
        world_list = s.split()
        #不能去除连续的‘ ’
        # world_list = s.split(' ')
        return ' '.join(world_list[::-1])

459 重复的子字符​​​​​​​

题目描述:

给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成。

题解一:枚举

class Solution:
    def repeatedSubstringPattern(self, s: str) -> bool:
        l = len(s)
        for i in range(1, l//2 + 1):
            if l % i == 0 and s[:i] * (l//i) == s:
                return True
        return False

题解二:移动匹配

判断字符串s是否由重复子串s'组成,只要两个s拼接在一起,里面还出现一个s的话,就说明是由重复子串组成。

eg: s's's' + s's's'  =  s' s's's' s'

当然,我们在判断 s + s 拼接的字符串里是否出现一个s的的时候,要刨除 s + s 的首字符和尾字符,这样避免在s+s中搜索出原来的s,我们要搜索的是中间拼接出来的s。

class Solution:
    def repeatedSubstringPattern(self, s: str) -> bool:
        return (s + s).find(s, 1) != len(s)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值