Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 检查字符串替换规则是否会生成另一个字符串_Algorithm - Fatal编程技术网

Algorithm 检查字符串替换规则是否会生成另一个字符串

Algorithm 检查字符串替换规则是否会生成另一个字符串,algorithm,Algorithm,不是家庭作业 给定两个长度相同的字符串S和T。 给定一组替换规则,在S中查找子字符串a并用字符串B替换它。 A和B的长度相同 是否存在规则应用程序的序列,以便将字符串S转换为字符串T 例如: 我们有替换规则 cat->dog dog->cut 我们有绳子 S1:awesomecat和S2:awesomecut 可以选择一系列更换 awesomecat awesomedog cat->dog awesomecut dog->cut 这是一个简单的例子,可能有这样的规则

不是家庭作业

给定两个长度相同的字符串S和T。 给定一组替换规则,在S中查找子字符串a并用字符串B替换它。 A和B的长度相同

是否存在规则应用程序的序列,以便将字符串S转换为字符串T

例如: 我们有替换规则

cat->dog
dog->cut
我们有绳子 S1:awesomecat和S2:awesomecut

可以选择一系列更换

awesomecat 
awesomedog cat->dog
awesomecut dog->cut
这是一个简单的例子,可能有这样的规则

cat->dog
ate->dog
dog->cat

我相信没有比在每个州尝试每一条规则更好的答案了。这将是指数时间。但我不知道是否有更好的解决方案。

您可以轻松地将此问题映射到一个有向图,其中所有规则都是从一个节点到另一个节点的有向路径

在收到输入A和B后,检查它们之间的差异,看看是否有一条沿着图形的路径可以产生预期的结果。

我建议您阅读=)它准确地讨论了您在这里描述的内容

总之,建议的一个解决方案是找到系统的一个属性:如果在操作开始时为true,在所有情况下都必须在操作结束时为true

如果第一个字符串具有该不变量,而结束字符串不具有该不变量,那么替换规则将永远不会生成第二个字符串

您的不变规则可以更强大…例如,它可以是当且仅当关系(当且仅当在第一步为真时,不变量在结束步骤中为真),因此,如果在第一个字符串中存在不为真的不变量,您可以证明结束字符串是不可访问的。请注意,如果您的所有规则都是双向工作的,则这些当且仅当关系自动遵循标准if关系时(您可以前后应用它们)

例如,在您的第一个系统中有一个可能的不变量:

  • 所有不包含连续字符串组合“cat”或“dog”的连续字符串也必须在结束状态下出现
给定该不变规则,可以直接提供一个决策公式来决定给定起始字符串时字符串是否可能


附加

我希望你不介意我采用霍夫斯塔特的说法,即:

  • 给定的起始字符串将被称为“axiom”
  • 公理可以由一套规则来执行
  • 任何一串字母都称为“定理”;由给定公理的规则产生的一串字母称为“有效定理”
所以,你的问题从“X能产生Y吗?”转移到“Y是一个有效的定理,可以从X导出吗?”

所以,让我们从更一般的术语来处理字符串替换问题。我们将调用
A
所有替换字符串的有序集,以及
A
所有替换字符串的有序集。因此,这里我们有一个通用规则:

"xA[n]y" => "xB[n]y"
这意味着,“如果我们在集合
a
中看到一个由字符串
x
y
包围的带有字符串的定理,那么我们也可以推导出,
xB[n]y
,其中
B[n]
是相应的替换字符串

让我们找出一些不变量,它们是真的,不管集合
A
B
中有什么

  • 由于替换字符串的长度始终与其替换字符串的长度相同,因此在
    a
    中找不到的公理中的任何字母都不得移动
例如,如果我们有axiom
abcdea
,并且规则集
A=[“cd”,de“]
,很容易看到字母A和b在
A
中找不到。因此,我们可以说这个系统中的所有定理都必须是
ab##a
形式。这给了我们一个规则来找出什么是而不是一个定理

然而,对于非常长的集合
A
,这可能对我们帮助不大,因为
A
可能会使用所有字母

让我们试着让它更有用

  • 公理末尾的任何字母,如果不在
    a
    中字符串的末尾,都不能移动。这同样适用于公理开头的任何字母,即
    a
    中不在字符串开头的字母
假设我们有
A=[“dog”、“cat”、“ton”]
,如果一个公理以任何不是g、t或c的字母结尾,那么所有可导定理也必须以同一个字母结尾。如果一个公理不是以d、c或t开头,那么所有可导定理也必须以相同的字母开头

这在某种程度上更有用,因为对于任何大小小于26的
A
,您将拥有它们不以结尾或开头的字母。然而,您的公理以这些特定字母开头或结尾的可能性要小得多

然而,我们发现我们可以进一步扩展:

  • 公理开头的任何连续字母串,如果在
    a
    中不是字符串开头的连续字母串,则不得移动;公理末尾的连续字符串与
    a
    中字符串末尾的连续字符串相同
我们会发现这更有用
A
必须至少有26^n个元素大,这样我们才能将此不变量视为无用

现在,注意,我们也可以倒退!也就是说,我们可以说:

  • B
    中,理论开头的任何连续字母串如果不是字符串开头的连续字母串,则所有公理中都必须存在;对于在
    B
    中不是字符串末尾的连续字符串的定理末尾的连续字符串,也是如此
有了这些规则,我就建立了一个模型,来找出我们需要的案例