python - 打印列表中第一个、第二个出现的字符
问题描述
我正在研究一个简单的算法,它打印出现两次或多次的第一个字符。
for eg:
string ='abcabc'
output = a
string = 'abccba'
output = c
string = 'abba'
output = b
我所做的是:
string = 'abcabc'
s = []
for x in string:
if x in s:
print(x)
break
else:
s.append(x)
output: a
但它的时间复杂度是 O(n^2),我怎么能在 O(n) 中做到这一点?
解决方案
更改s = []
为s = set()
(显然对应append
于add
)。in
over set 是 O(1),不像in
over list 是顺序的。
或者,使用正则表达式(O(n^2),但相当快速和容易):
import re
match = re.search(r'(.).*\1', string)
if match:
print(match.group(1))
正则表达式的(.).*\1
意思是“我们稍后会记住的任何字符,任意数量的中间字符,然后再次记住的字符”。由于正则表达式是从左到右扫描的,它会根据需要找到a
in"abba"
而不是b
。
推荐阅读
- firebase - 请求中的数据字段不能包含重复键(Firebase 函数推送通知)
- sql - SQL中同一张表的FULL JOIN
- html - 如何使我的下拉菜单正常工作?
- django - 如何在 DRF 泛型 APIView 中创建与角色名称相同名称的组
- python - 倒数计时器在python中重叠
- sql - 帐号重复存在问题,需要根据需要将“LASTMEMBERACTIVITY”列限制为 90 天
- python - Selenium:当 ValueError(“未找到表”)时如何重试浏览器/URL
- python - 熊猫:如果条件为真,则使用另一列替换列中的值
- javascript - 无法在 A-Frame/THREE.js 中的对象上设置着色器
- android - 在 Kotlin 中设置 Recycler View,不了解如何在 recyclerView 变量上调用方法而不实例化它