Python数据结构与算法59:排序与查找编程练习题3:字符串中所有重排

:本文如涉及到代码,均经过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.

你可能感兴趣的:(Python数据结构与算法59:排序与查找编程练习题3:字符串中所有重排)