注:本文如涉及到代码,均经过Python 3.7实际运行检验,保证其严谨性。
本文阅读时间约为5分钟。
给定一个字符串s与待查找字符串p,请给出使得s[i:i+len(p)]是p的一个字母重排的所有下标i。
题目保证字符串p非空。
输入格式:
两行字符串,第一行为s,第二行为p。
输出格式:
所有满足条件的下标从小到大排列,以空格分隔输出。
若无对应下标,则输出"none"。
输入样例:
cbaebabacd
abc
输出样例:
0 6
参考代码模板:
def findAnagrams(s, p):
# code here
pass
s = input()
p = input()
findAnagrams(s, p)
解答:本题的关键在于如何判断一个字符串s的子串s[i:i+len(p)]是另一个字符串p的字母重排,也就是如何判断两个字符串互为对方的字母重排。我们可以利用集合的无序特性,简单直接地来实现这个判断,即
set(p) == set(s[i:i+len(p)])
满足上述表达式的p和s必然满足“字符串s的子串s[i:i+len(p)]是字符串p的字母重排”这一要求。
解决这个问题,本题也就简单了。
参考代码如下:
def findAnagrams(s, p):
# code here
s1 = '' # 备用字符串。
for i in range(len(s)):
# 利用集合的特性判断s[i:i+len(p)]是否为p的字母重排。
if set(p) == set(s[i:i+len(p)]):
s1 += str(i)
if s1 == '': # 若无对应下标i,则输出"none"。
print('none')
else: # 若有对应下标i,将所有满足条件的下标i从小到大排列,以空格分隔输出。
print(' '.join(s1))
s = input()
p = input()
findAnagrams(s, p)
# 测试数据如下:
# s = 'cbaebabacd'
# p = 'abc'
To be continued.