我有17万个单词列表,我正在编写一个算法,使用每个单词的图表来查看最长的单词链;
单词链是一个单词列表,其中第i个单词是带有一个额外字符的(i-1)个单词,其他字符以任何方式排列
A - > AN - > CAN - >甘蔗
现在我按字母顺序列出所有单词,如CAT = ACT
我说当字符串2包含字符串1加上另一个字符
时添加边但是在
的情况下A-> AT - > ACT
没有绘制AT和ACT之间的边缘,因为C分割了A和T而我的if语句只有在找到“AT”时才有效。
如何告诉python搜索字符串以使字符的顺序无关紧要?
答案 0 :(得分:2)
您可以创建一组两个字符串:
set1 = set(string1)
set2 = set(string2)
然后查看string1
是否包含string2
set1.issubset(set2) # => returns True if set2 contains everything from set1
答案 1 :(得分:2)
你可以使用collections.Counter
并将两个字符串转换成它(它会计算字符串中的字母),然后你可以比较它是否相等。示例 -
s1 = 'ACT'
s2 = 'CAT'
from collections import Counter
if Counter(s1) == Counter(s2):
#Do stuff
演示 -
>>> s1 = 'ACT'
>>> s2 = 'CAT'
>>> from collections import Counter
>>> Counter(s1) == Counter(s2)
True
如果您想检查另一个字符串是否包含在另一个字符串中而不关心订单,可以使用any()
内置函数,如下所示 -
s1 = 'AXCT'
s2 = 'CAT'
A = Counter(s1)
B = Counter(s2)
if not any(count > A.get(b, 0) for b,count in B):
#Do stuff.
或者您也可以执行以下操作(如@Kevin in the comments所示) -
s1 = 'AXCT'
s2 = 'CAT'
A = Counter(s1)
B = Counter(s2)
if (B & A) == B:
#Do stuff
答案 2 :(得分:0)
str1 = 'A'
str2 = 'T'
searchstring = 'ACT'
if str1 in searchstring and str2 in searchstring:
print('it matched')
# bigger example
str1 = 'AT'
searchstring = 'ACT'
matches = [a for a in str1 if a in searchstring]
if len(matches) == len(searchstring):
print('it matched')
答案 3 :(得分:0)
您可以将较长的字符串转换为正则表达式,然后匹配它。一种简单的方法是使所有字符都是可选的,首先检查目标字符串是否更长一个字符:
def can_reach(frm, to):
if len(to) != len(frm) + 1: return False
if not re.fullmatch(re.sub(r'(.)', r'\1?', to), frm): return False
return True
如果你没有Python 3.4,那么使用一个明确的$
锚:
def can_reach(frm, to):
if len(to) != len(frm) + 1: return False
if not re.match(re.sub(r'(.)', r'\1?', to) + '$', frm): return False
return True