String 使用一些字符串形成给定模式的算法

String 使用一些字符串形成给定模式的算法,string,algorithm,design-patterns,String,Algorithm,Design Patterns,给定6个任意长度的字符串。单词应按如下所示的模式排列。它们可以垂直或水平排列 -------- | | | | | | --------------- | | | | | | -------- 图案不需要对称,需要有两个空白区域,如图所示。 例如: 给定字符串 PQF

给定6个任意长度的字符串。单词应按如下所示的模式排列。它们可以垂直或水平排列

      --------
      |      |
      |      |
      |      |
      ---------------
             |      |
             |      |
             |      |
             --------
图案不需要对称,需要有两个空白区域,如图所示。 例如:

给定字符串

PQF  
DCC  
ACTF  
CKTYCA  
PGYVQP  
DWTP 
模式可以是

DCC...  
W.K...  
T.T...  
PGYVQP  
..C..Q  
..ACTF  
其中点表示空白区域

另一个例子是

RVE  
LAPAHFUIK  
BIRRE  
KZGLPFQR  
LLHU  
UUZZSQHILWB 
模式是

LLHU....  
A..U....   
P..Z....  
A..Z....  
H..S....  
F..Q....  
U..H....  
I..I....  
KZGLPFQR  
...W...V  
...BIRRE 

若有多个模式是可能的,那个么将形成具有词典学上最小的第一行、第二行等的模式。可以使用什么算法来解决此问题?

查找适合此约束的字符串:

strlen(a) + strlen(b) - 1 = strlen(c)
strlen(d) + strlen(e) - 1 = strlen(f)
在此之后,尝试所有可能的情况,如果它们是有效的。比如,

aaa.....
d.f.....
d.f.....
d.f.....
cccccccc
..f....e
..f....e
..bbbbbb

将出现
2*2*2=8
不同的情况。

查找适合此约束的字符串:

strlen(a) + strlen(b) - 1 = strlen(c)
strlen(d) + strlen(e) - 1 = strlen(f)
在此之后,尝试所有可能的情况,如果它们是有效的。比如,

aaa.....
d.f.....
d.f.....
d.f.....
cccccccc
..f....e
..f....e
..bbbbbb

不同的情况下会出现
2*2*2=8

您可以应用许多启发法,但在此之前,让我们先看看这个谜题的一些属性

+aa+
c  f
+ee+eee+
   f   d
   +bbb+
让我们用上图中显示的相同字符调用字符串的长度。我们有:

a + b - 1 = e
c + d - 1 = f

我将把中间的十字形的2个字符串称为中间字符串。

我们还推断字符串的长度不能小于2。因此,我们可以推断:

e > a, e > b
f > c, f > d
由此可知,由于上述不等式,最短的两个字符串不能是中间字符串

3个最大的字符串也不能相等,因为在选择3个字符串中的任何一个作为中间字符串后,剩下2个最大的字符串相等,根据上面的不等式,这是不可能的

只有当长度是规则的时候,这个谜题才是棘手的。当长度不规则时,可以直接从长度映射到位置

如果我们有两个最大的字符串相等,由于上面的不等式,它们是两个中间字符串。最糟糕的情况是一个“规则”的拼图,其中长度a,b,c,d相等

如果两个最大的字符串不相等,则可以立即确定最大字符串的位置(因为其长度在拼图中是唯一的)-作为中间字符串之一。在最坏的情况下,另一个中间字符串可能有3个候选项-只需使用蛮力并检查所有候选项

算法:

  • 尝试将唯一长度字符串映射到该位置
  • 《暴力》中的2个字符串(考虑到我上面提到的),和蛮力来填充其余部分。

即使使用愚蠢的蛮力,也只有6个!=720个案例,如果字符串只能从左到右,从上到下(无反转)。如果允许字符串在任何方向上,将有46080个案例(*2^6)。

您可以应用许多启发式方法,但在此之前,让我们先看看这个谜题的一些属性

+aa+
c  f
+ee+eee+
   f   d
   +bbb+
让我们用上图中显示的相同字符调用字符串的长度。我们有:

a + b - 1 = e
c + d - 1 = f

我将把中间的十字形的2个字符串称为中间字符串。

我们还推断字符串的长度不能小于2。因此,我们可以推断:

e > a, e > b
f > c, f > d
由此可知,由于上述不等式,最短的两个字符串不能是中间字符串

3个最大的字符串也不能相等,因为在选择3个字符串中的任何一个作为中间字符串后,剩下2个最大的字符串相等,根据上面的不等式,这是不可能的

只有当长度是规则的时候,这个谜题才是棘手的。当长度不规则时,可以直接从长度映射到位置

如果我们有两个最大的字符串相等,由于上面的不等式,它们是两个中间字符串。最糟糕的情况是一个“规则”的拼图,其中长度a,b,c,d相等

如果两个最大的字符串不相等,则可以立即确定最大字符串的位置(因为其长度在拼图中是唯一的)-作为中间字符串之一。在最坏的情况下,另一个中间字符串可能有3个候选项-只需使用蛮力并检查所有候选项

算法:

  • 尝试将唯一长度字符串映射到该位置
  • 《暴力》中的2个字符串(考虑到我上面提到的),和蛮力来填充其余部分。

即使使用愚蠢的蛮力,也只有6个!=720个案例,如果字符串只能从左到右,从上到下(无反转)。如果允许字符串在任何方向上,将有46080个案例(*2^6)。

似乎必须对字符串的长度进行一些限制。字符串没有任何相对限制。可能会有这样的情况,当没有这样的模式是可能的,那么同样的是要回答。好吧,我想你可以玩模,首先做一个程序,使4路交叉口。只是做一些聪明的蛮力。在6个字符串中,中间2个字符串最多只能有4个候选字符串。角上的两个字符串的候选字符串非常受限。似乎字符串的长度必须有一些约束。字符串没有任何相对约束。可能会有这样的情况,当没有这样的模式是可能的,那么同样的是要回答。好吧,我想你可以玩模,首先做一个程序,使4路交叉口。只是做一些聪明的蛮力。在6个字符串中,中间2个字符串最多只能有4个候选字符串。角上的两个字符串的候选字符非常有限。每个子字符串中的第一个字符重叠,因此将是strlen(a)+strlen(b)-1=strlen(c)8。这种情况仅适用于这种情况。在最坏的情况下,将出现
4!*2! = 48
situation每个子字符串中的第一个字符重叠,因此它将是strl