给定两个整数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)中的索引

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...