LeetCode---字符串

LeetCode

344. 反转字符串

题目链接

解:双指针

def reverseString(s):

    left = 0
    right = len(s) - 1

    while left <= right:
        s[left], s[right] = s[right], s[left]
        left += 1
        right -= 1

    return s

541. 反转字符串 II

题目链接

解:暴力法

    if len(s) < k:
        return s[::-1]

    num, remainder = divmod(len(s), k)
    res = ""

    for i in range(num):
    	# 余数为0时,需要反转k个字符
        if i % 2 == 0:
            cur = k + i * k - 1
            pre = max(k + (i - 1) * k, 0)
            while cur >= pre:
                res += s[cur]
                cur -= 1
        else:
            cur = k + (i - 1) * k
            pre = k + i * k
            while cur < pre:
                res += s[cur]
                cur += 1

    if num % 2 == 0:
        return res + s[:-(remainder+1):-1] if remainder else res
    else:
        return res + s[-remainder:] if remainder else res

151.翻转字符串里的单词

题目链接

解一:暴力法

def reverseWords(s):
    res = []
    s = s.strip(" ")
    temp = ""
    # 减少空格
    for index, i in enumerate(s):
        if i == " ":
        	# 多个空格只保留一个
            if temp == " ":
                continue
            else:
                res.append(temp)
                temp = " "
        # 处理最后一个字符
        elif index == len(s) - 1:
            if temp == " ":
                res.append(temp)
                res.append(i)
            else:
                temp += i
                res.append(temp)
        else:
            if temp == " ":
                res.append(temp)
                temp = i
            else:
                temp += i

    res.reverse()

    return "".join(res)

解二:双端队列

在这里插入代码片

KMP算法

KMP算法

def get_next(s):
    """
    计算KMP算法的匹配表
    :param s: 模式字符串
    :return: 返回匹配表
    """
    # 初始化匹配表
    nexts = [0] * len(s)
    # j有两个含义:1.前缀末尾; 2.前缀和后缀最长相等串长度;
    # i:代表后缀的末尾
    j = 0

    for i in range(1, len(s)):
        # 不相等时,j左移
        while j > 0 and s[j] != s[i]:
            j = nexts[j-1]
        # 相等时,在之前相等的基础上右移一位
        if s[j] == s[i]:
            j += 1
        nexts[i] = j

    return nexts

28. 实现 strStr() 函数

题目链接

解: KMP
def strStr(haystack, needle):
    def get_nexts(s):
        """
        计算KMP算法的匹配表
        :param s: 模式字符串
        :return: 返回匹配表
        """
        # 初始化匹配表
        nexts = [0] * len(s)
        # j 有两个含义:1.前缀末尾; 2.前缀和后缀最长相等串长度;
        # i:代表后缀的末尾
        j = 0

        for i in range(1, len(s)):
            # 不相等时,j左移
            while j > 0 and s[j] != s[i]:
                j = nexts[j - 1]
            # 相等时,在之前相等的基础上右移一位
            if s[j] == s[i]:
                j += 1
            nexts[i] = j

        return nexts

	# 模式串为""时,返回0
    if not needle:
        return 0

    j = 0
    nexts = get_nexts(needle)

    for i in range(len(haystack)):
		# 如果i和j指向的元素不相等,则j通过匹配表跳转到nexts[j-1]
        while j > 0 and haystack[i] != needle[j]:
            j = nexts[j-1]
		# 如果i和j指向的元素相等,j和i都加一,匹配下一个位置的元素
        if haystack[i] == needle[j]:
            j += 1
		# 如果全部元素匹配结束则返回下标
        if j >= len(needle):
            return i - len(needle) + 1

    return -1

459. 重复的子字符串

题目链接

解: KMP
在这里插入代码片
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值