问题描述
你能帮我吗?我需要为使用以下两个字母 a 和 b 的单带图灵机编写代码。
所以程序应该显示两个单词的共同前缀。
例如:g(aab,aaaba) -> aa; g(_,abab) -> _; g(aaba,baa) -> _; g(_,_) -> _; g(babaab,babb) -> bab
其中 g 是机器的功能,下划线表示空词,词之间有空格
我尝试实现以下选项:
如果在开始时我们看到字母 a,那么我们将其擦除并移至第二个单词的开头。如果我们在那里也看到一个字母 a,我们也将其擦除,并在两个单词之后通过空格写出 a。之后我们回到第一个单词的开头,重复这个操作。当第一个单词的第一个字母和第二个单词的第一个字母不再匹配时,我们将删除剩下的所有内容。
但是我在代码方面遇到了一些麻烦,因为每次操作后,两个单词之间的空格会变长,我不知道如何控制。当第一个或第二个词完全是公共前缀时也会有麻烦,如下所示:g(baa,baabab) -> baa
解决方法
你的方法看起来很合理。根据您的描述,您似乎无法概括某些单独的步骤。
比如处理两个单词之间不断增长的空格,记住在程序中的任何时候,这两个单词都用一个或多个空格隔开。因此,针对这种一般情况实施您的搜索操作。
对于常见的前缀情况,您必须处理最终用完要比较的字符的情况。所以在从第一个单词中删除字符后,在寻找第二个单词的开头时,检查您传递的第一个字符是字母还是空格。如果它是一个空格,则您处于前缀大小写中,并且需要注意不要尝试稍后返回到第一个单词,因为您已经删除了所有它并且只剩下空格。同样,如果第二个单词是前缀,则在查找输出时可以检测到这一点。
尝试将算法分解为基本步骤,并单独测试每个步骤。当您可以孤立地专注于一个简单的步骤时,确保正确处理极端情况要容易得多,而不必将其作为更大算法的一部分进行测试。这样做是调试代码的一项基本技能,因此将其视为一个很好的练习。即使一开始看起来很痛苦,也要确保你有一种结构化的方法来分析问题并将你的代码分解成更小的部分,最终你将能够解决任何问题。快乐编码!