python扫描线填充算法_LeetCode算法第1002.Find Common Characters(找出公共字符)

bcb897a476ce1032c4c313712a148431.png

技术提高是一个循序渐进的过程,所以我讲的leetcode算法题从最简单的level开始写的,然后> 到中级难度,最后到hard难度全部完。目前我选择C语言,Python和Java作为实现语言,因为这三种语言还是比较典型的。由于篇幅和> 精力有限,其他语言的实现有兴趣的朋友请自己尝试。初级难度说的差不多的时候,我打算再加点其他内容,我可能会从操作系统到协议栈,从分布式> 聊到大数据框架,从大数据聊到人工智能,... ...。

如果有任何问题可以在文章后评论或者私信给我。

我会持续分享下去,敬请您的关注。

LeetCode 1002. 找出公共字符(Find Common Characters)

问题描述:

给定一个仅由小写字母组成的字符串数组A ,返回列表中所有字符串都存在的字符列表(包括重复的)。例如,如果一个字符在所有字符串中出现了3次但不是4次,则需要在最终答案中包含该字符三次。您可以按任何顺序返回答案。注:

1. 1 <= A.length <= 100

2. 1 <= A[i].length <= 100

3. A[i][j] 是一个小写字母

示例:

0241ba7b32040965c80e2efa760c3217.png

C语言实现:

我的实现是,先创建一个长度是26的数组counter,用来统计不同的字符作为公共字符出现的次数。

首先将A[0]中不同的字符出现的次数统计到counter中,单独对A[0]这样做,主要是为了填充counter,为后续的比较操作做准备。

然后我们开始从A[1]开始遍历数组A。在每次遍历中:

我们会创建一个局部的数组tmpCounter,它的形式和counter是完全一样的,用来统计当前字符串中不同的字符出现的次数。

tmpCounter的填充完成以后,要做的就是counter和tmpCounter的比较,这是最关键的步骤,比较的结果是,counter[i] = min(counter[i], tmpCounter[i])。即,counter只统计每个字符在所有字符串中出现次数的最小值。

当我们遍历结束的时候,counter里面统计的就是不同的字符作为公共字符出现的次数的状况。

最后我们遍历counter,填充返回数组res就可以了。

04ffcd196c9554b0b840865daba6f4dc.png

这里需要注意一点,对counter和tmpCounter的初始化,我们需要将去初始化为全0,推荐用静态初始化的方法,毕竟长度是只有26。不推荐用memset或bzero, 尤其是对于tmpCounter,每次循环都要将其重置为全0,如果用memset/bzero话,会有一些性能开销。

7b088d8f7d95d41113fd67c88fb0bb1b.png

Java语言实现:

Java 的实现和C语言的实现一致,不再撰述。

c9e3d79e7f5f9a98d40982db3417f0d8.png
3b1fa7b8d3196d394692585785b1ad0c.png

Python语言实现:

Python的话我们用Counter会比较简洁,其实思路和上面描述的没有本质区别,不再撰述。

77c9ed850d01ff04733d1cb457441d7f.png
2c072c78a443bd56db028f1bb2ea8810.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
KMP算法是一种字符串匹配算法,用于在一个文本串S内查一个模式串P的现位置。它的时间复杂度为O(n+m),其中n为文本串的长度,m为模式串的长度。 KMP算法的核心思想是利用已知信息来避免不必要的字符比较。具体来说,它维护一个next数组,其中next[i]表示当第i个字符匹配失败时,下一次匹配应该从模式串的第next[i]个字符开始。 我们可以通过一个简单的例子来理解KMP算法的思想。假设文本串为S="ababababca",模式串为P="abababca",我们想要在S中查P的现位置。 首先,我们可以将P的每个前缀和后缀进行比较,得到next数组: | i | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | | --- | - | - | - | - | - | - | - | - | | P | a | b | a | b | a | b | c | a | | next| 0 | 0 | 1 | 2 | 3 | 4 | 0 | 1 | 接下来,我们从S的第一个字符开始匹配P。当S的第七个字符和P的第七个字符匹配失败时,我们可以利用next[6]=4,将P向右移动4个字符,使得P的第五个字符与S的第七个字符对齐。此时,我们可以发现P的前五个字符和S的前五个字符已经匹配成功了。因此,我们可以继续从S的第六个字符开始匹配P。 当S的第十个字符和P的第八个字符匹配失败时,我们可以利用next[7]=1,将P向右移动一个字符,使得P的第一个字符和S的第十个字符对齐。此时,我们可以发现P的前一个字符和S的第十个字符已经匹配成功了。因此,我们可以继续从S的第十一个字符开始匹配P。 最终,我们可以发现P现在S的第二个位置。 下面是KMP算法的C++代码实现:

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值