LINTCODE:438 找到字符串中所有的字母异位词(Python语言实现)

本文介绍了一种利用字典和游标技术在给定字符串中查找所有与目标字符串构成字母异位词的子串方法,详细阐述了算法原理并提供了Python实现代码。

题目描述

给定一个字符串s和一个非空字符串p,找到s中所有是p的字母异位词的子串,返回这些子串的起始索引。

字符串只包含小写英文字母,并且字符串s和p的长度都不超过20100。

  • 说明
字母异位词指字母相同,但排列不同的字符串。
不考虑答案输出的顺序。
  • 示例1
输入: s: "cbaebabacd"  p: "abc"
输出: [0, 6]
解释: 起始索引等于0的子串是"cba",它是"abc"的字母异位词。
      起始索引等于6的子串是"bac",它是"abc"的字母异位词。
  • 示例2
输入: s: "abab"   p: "ab"
输出: [0, 1, 2]
解释: 起始索引等于0的子串是"ab",它是"ab"的字母异位词。
      起始索引等于1的子串是"ba",它是"ab"的字母异位词。
      起始索引等于2的子串是"ab",它是"ab"的字母异位词。

游标字典法

使用字典可避免超出时间限制,游标的使用在于是否超过字符串p的长度,超过则使当前位置的字符次数减一,否则进行比较字典中的元素。

def findAnagrams(self, s, p):
    """
    :type s: str
    :type p: str
    :rtype: List[int]
    """
    s_len, p_len = len(s), len(p)
    if s_len < p_len:
        return []
    res = []
    compare_dict = {}
    for pu in p:
        compare_dict[pu] = compare_dict.get(pu, 0) + 1
    current_dict = {}
    for sk, su in enumerate(s):
        current_dict[su] = current_dict.get(su, 0) +1
        if current_dict == compare_dict:
            res.append(sk-p_len+1)
        if sk-p_len+1 >=0:
            current_dict[s[sk-p_len+1]] = current_dict.get(s[sk-p_len+1]) -1
            if current_dict[s[sk-p_len+1]] == 0:
                del current_dict[s[sk-p_len+1]]
    return res

(最近更新:2019年05月15日)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值