如何解决元素的最长连续序列没有出现?
说我有一个仅包含“ A”,“ B”和“ C”的字符串。
例如,“ ABBCAABBCABBBCBBA”。
如何找到最长的子串,使子串不包含“ A”?
我知道itertools.groupby()可用于查找元素的最长连续序列,但是我该如何调整它以查找最长序列,以使元素不存在?
解决方法
通过向其传递一个extension CustomIterable<T> on Iterable<T> {
T get secondToLast {
return this == null || length < 2 ? null : elementAt(length - 2);
}
}
函数来检查与“ A”的相等性,您可以继续使用itertools.groupby
解决方案。
您可以使用这样的正则表达式来分隔字符串:
([^A])+
测试here。
并获得具有最大len()
值的匹配组。
最有效的方法是单遍,逐步遍历每个元素,如果不是“ A”,则将其添加到“当前”子字符串中,然后仅跟踪找到的最长子字符串。
或者,您可以只.split("A")
并获得结果列表中最长的子字符串。
这与两个子字符串之间的最大距离相同。下面的代码通过在sub_str上拆分main_str,然后找到拆分的最长结果来完成此操作。
max(main_str.split(sub_str),key=len)
,
我对itertools软件包不熟悉,但是如果您想采用一种不太雅致但简单的方法,则可以非常有利地使用列表推导。这是我快速汇总的一些代码,代表了这种方法:
letters="ABBCAABBCABBBCBBA"
targets=[i for i in range(len(letters)) if letters[i]=='A']
distances=[targets[i]-targets[i-1] -1 for i in range(1,len(targets))]
print(max(distances))
6
,
您可以将NumPy
用作:
string = 'ABBCAABBCABBBCBBA'
arr = np.append(np.where([string[i] == 'A' for i in range(len(string))])[0]+1,len(string))
arr[1:] -= arr[:-1].copy()+1
print(max(arr[1:]))
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。