如何从集合E *中构造出恰好出现一次111的字符串,该集合E *由集合{0,1}中所有可能的元素组合组成?
答案 0 :(得分:1)
您可以根据以下步骤生成字符串集:
列举了一些数字及其法律地位:
开始:110
必须有一个,任何地方:111
任何地方:0,010,0110
结束:011
取决于目标字符串的长度(长度应大于3)
条件1:长度= 3:{111}
条件2:6>长度> 3 :(长度-3)= 1x + 3y + 4z
例如,如果长度为5:答案是(2,1,0)和(1,0,1)
(2,1,0) - >两个'0'和一个'010' - > ^ 0 ^ 010 ^或^ 010 ^ 0 ^(111可以放置在标记为^的任何一个地方)
(1,0,1) - >一个'0'和一个'0110'......
条件3:如果9>长度> 6,你应该考虑两个公式的解决方案:
评论:
长度 - 3:长度不包括111
x:时间0发生
y:时间010发生
z:0110发生的时间
查找所有解{{x,y,z)| 1x + 3y + 4z =(长度 - 3)} ----(1)
对于每个解决方案,您可以生成一个或多个限定字符串。例如,如果要生成长度为10的字符串。(x,y,z)的一个解是(0,2,1),这意味着'010'应该出现两次,'0110'应该出现一次。基于此解决方案,可以生成以下字符串:
0:x0次
010:x 2次
0110:x1次
111:x1次(必须有)
查找上述元素的排列。 010-0110-010-111或111-010-010-0110 ......
(长度 - 6)= 1x + 3y + 4z ---(2) 与上述情况类似,找到所有排列以形成中间字符串。 最后,对于每个中间字符串Istr,Istr + 011或110 + Istr都是合格的。
例如,(10-6)= 1 * 0 + 3 * 0 + 4 * 1或= 1 * 1 + 3 * 1 + 4 * 0
对于答案(0,0,1),中间字符串可以由一个'0110'组成: 那么^ 0110 ^ 011和110 ^ 0110 ^是合格的字符串(111可以放在标记为^的任何一个地方)
或者中间字符串也可以由一个'0'和一个'010'组成,用于答案(1,1,0)
中间字符串可以是0 010或010 0 然后^ 0010 ^ 011和110 ^ 0100 ^是限定字符串(111可以放在标记为^的任何一个地方)
条件4:如果长度> 9,应考虑加法公式:
(长度 - 9)= 1x + 3y + 4z
与上述情况类似,找到所有排列以形成中间字符串。 最后,对于每个中间字符串Istr,110 + Istr + 011是合格的。
阐释:
我使用的逻辑基于组合数学。目标字符串被视为一个或多个子字符串的组合。为了满足约束('111'在目标字符串中恰好出现一次),我们应该在子字符串上设置标准。 '111'绝对是一个子串,它只能使用一次。其他子串应该防止违反'111'一次性约束,并且通常足以生成所有可能的目标字符串。
除了只有一个111之外,其他子串不应该有两个以上的相邻'1'。 (因为如果其他子串具有两个以上的相邻1,例如'111','1111','11111',则子串将包含不必要的'111')。除了只有一个111之外,其他子串不应超过两个连续的'1'。因为如果其他子串具有两个以上的连续1,例如'111','1111','11111',则子串将包含不必要的'111'。但是,子串“1”和“11”不能确保只有一个111约束。例如,'1'+'11','11'+'11'或'1'+'1'+'1'都包含不必要的'111'。为了防止不必要的'111',我们应该添加'0'来阻止更多的邻近'1'。这导致三个合格的子串'0','010'和'0110'。由三个合格子字符串组成的任何组合字符串将包含零次'111'。
以上三个合格的子字符串可以放在目标字符串中的任何位置,因为它们100%确保目标字符串中没有额外的“111”。
如果子串的位置在开头或结尾,他们只能使用一个'0'来阻止'111'。
开始时:
10xxxxxxxxxxxxxxxxxxxxxxxxxxxx
110xxxxxxxxxxxxxxxxxxxxxxxxxxx
最后:
xxxxxxxxxxxxxxxxxxxxxxxxxxx011
xxxxxxxxxxxxxxxxxxxxxxxxxxxx01
这两种情况也可以确保没有额外的'111'。
基于上面提到的逻辑。我们可以生成任意长度的目标字符串,其中只有一个'111'。
答案 1 :(得分:0)
你的问题可以更清楚。
首先,"1111"
是否包含一次"111"
或两次?
如果是这样,您希望包含"111"
但不包含"1111"
或"111.*111"
的所有字符串。如果没有,请省略"1111"
的测试。
如果我理解正确,那么你正在尝试构造0和1的无限序列集的无限子集。你如何做到这可能取决于你正在使用的语言(大多数语言没有办法表示无限集)。
我最好的猜测是你要生成一系列0和1的序列(不应该太难)并选择符合你标准的序列。