首页 > 解决方案 > 在没有库函数的情况下在 Sml 中查找字符串是否是另一个字符串的子字符串

问题描述

我正在尝试编写一个函数 subString : string * string -> int 检查第一个字符串是否是第二个字符串的子字符串并且区分大小写。

如果第一个字符串是子字符串,我想返回从 0 开始的索引,如果不是,则返回 -1。如果它出现多次,则返回第一次出现的索引。

例如:

subString("bc","abcabc") ===>1
subString("aaa","aaaa") ===>0
subString("bc","ABC") ===>-1

我在思考这个问题时遇到了很多麻烦,因为我不太熟悉 sml 或在 sml 中使用字符串,而且我不应该使用像 String.sub 这样的任何内置函数。

我可以使用辅助函数。

我所能想到的就是在辅助函数中以某种方式使用explode,并以某种方式检查列表然后将它们内爆,但是我如何获得索引位置?

我只有

fun subString(s1,s2) =
     if null s2 then ~1
     else if s1 = s2 then 0
     else 1+subString(s1, tl s2);

我正在考虑使用一个辅助函数来分解字符串,然后可能会比较两者,但我不知道如何让它工作。

标签: stringrecursionsubstringsmlml

解决方案


这已经是一个非常好的开始,但是有一些小问题:

在您的递归情况下,您将 1 添加到递归结果,即使递归应用程序没有找到子字符串并返回 -1。您应该在加 1 之前检查结果是否为 -1。

在第二行中,您检查两个字符串是否相等。如果你这样做,你只会在字符串以那个子字符串结尾时找到一个子字符串。所以在第 2 行你真正想做的是测试 s2 是否以 s1 开头。我建议您编写一个执行该测试的辅助函数。对于这个辅助函数,您确实可以使用explode,然后递归检查列表的第一个字符是否相同。一旦你有了这个辅助函数,就在第 2 行使用它而不是相等测试。


推荐阅读