string - 在没有库函数的情况下在 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);
我正在考虑使用一个辅助函数来分解字符串,然后可能会比较两者,但我不知道如何让它工作。
解决方案
这已经是一个非常好的开始,但是有一些小问题:
在您的递归情况下,您将 1 添加到递归结果,即使递归应用程序没有找到子字符串并返回 -1。您应该在加 1 之前检查结果是否为 -1。
在第二行中,您检查两个字符串是否相等。如果你这样做,你只会在字符串以那个子字符串结尾时找到一个子字符串。所以在第 2 行你真正想做的是测试 s2 是否以 s1 开头。我建议您编写一个执行该测试的辅助函数。对于这个辅助函数,您确实可以使用explode,然后递归检查列表的第一个字符是否相同。一旦你有了这个辅助函数,就在第 2 行使用它而不是相等测试。
推荐阅读
- javascript - Google Drive API v3,如何从 HTML2Canvas、Javascript、ajax、php 简单上传图像
- java - 使用@Import 注释会创建导入文件中定义的所有bean吗?
- html - 如何使用foreach循环在html中的列内动态嵌套行?
- postgresql - 如何使用参数创建触发器和函数?
- sql - 按最后更新的顺序显示表名
- database - 用于数据库上 CRUD 操作的打包应用程序
- javascript - Vue Computed 属性未更新 - 未定义数据属性的奇怪行为
- javascript - 如何检测带有下划线的字符串的正则表达式模式
- kubernetes - 列出 K8s 中某个 pod 使用的 secret
- javascript - 如何在过滤后的 html 选择字段中选择第一个选项