微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

给定两个整数m和n,其中m> = n,如何创建一个生成器以返回所有滑动窗口?

如何解决给定两个整数m和n,其中m> = n,如何创建一个生成器以返回所有滑动窗口?

为清楚起见,考虑两个字符串,一个长度为m,另一个长度为n。

例如,m = 3和n = 2,其中s1 = abc和s2 = de。

首先我们进行比较:

 abc 
de
and generate tuple (0,1) (as a and e are being compared,so give their indices)
then slide string s2

 abc 
 de
generate (0,0) {compare a and d} 
generate (1,1) {compare b and e}
 slide string s2

 abc 
  de
generate (1,0) {compare b and d} 
generate (2,1) {compare c and e}
 slide string s2

 abc 
   de
generate (2,0) {compare c and d} 

所以我们以该顺序返回generate(0,1),(0,0),(1,1),(1,0),(2,1),(2,0)

例如,如果m = 2且n = 2

我们将使用滑动较小字符串的相同方法生成(0,1),(0,0),(1,1),(1,0)。

解决方法

out = (
    (i1,i2)
    for anchor in range(n-1,-m,-1)
    for i1,i2 in enumerate(range(anchor,n))
    if 0 <= i1 < m and 0 <= i2 < n
)

测试

for m,n in [(3,2),(2,(5,3)]:
    out = (
        (i1,i2)
        for anchor in range(n-1,-1)
        for i1,n))
        if 0 <= i1 < m and 0 <= i2 < n
    )
    print(*out,'',sep='\n')

输出

(0,1)
(0,0)
(1,1)
(1,0)
(2,1)
(2,0)

(0,2)
(0,2)
(1,1)
(3,2)
(2,0)
(3,1)
(4,2)
(3,0)
(4,0)
,

您可以这样做:

m = 3
n = 2

gen = ((j+i,j) 
       for i in range(1-n,m)
       for j in range(max((0,-i)),min((n,m-i))))

for t in gen:
    print(t)

给予:

(0,0)

这里:

  • i是两个字符串的第一个字符之间的偏移量(在您的示例中,从-1到2依次排列)
  • j是第二个字符串(s2)中的索引

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。