Algorithm 检查字符串替换规则是否会生成另一个字符串
不是家庭作业 给定两个长度相同的字符串S和T。 给定一组替换规则,在S中查找子字符串a并用字符串B替换它。 A和B的长度相同 是否存在规则应用程序的序列,以便将字符串S转换为字符串T 例如: 我们有替换规则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 这是一个简单的例子,可能有这样的规则
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”
- 公理可以由一套规则来执行
- 任何一串字母都称为“定理”;由给定公理的规则产生的一串字母称为“有效定理”
A
所有替换字符串的有序集,以及A
所有替换字符串的有序集。因此,这里我们有一个通用规则:
"xA[n]y" => "xB[n]y"
这意味着,“如果我们在集合a
中看到一个由字符串x
和y
包围的带有字符串的定理,那么我们也可以推导出,xB[n]y
,其中B[n]
是相应的替换字符串
让我们找出一些不变量,它们是真的,不管集合A
和B
中有什么
- 由于替换字符串的长度始终与其替换字符串的长度相同,因此在
中找不到的公理中的任何字母都不得移动a
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