如何解决如何使用序列从字符串中生成所有子字符串?
我正在尝试学习 Kotlin 中的 Sequence
。
假设我想使用 yield 语句获取字符串的所有子字符串的序列。我了解如何使用带有左右边框的两个嵌套循环来执行此操作。
在我看来,有一种有效的方法可以使用一个 Sequence 或一对嵌套的 Sequences 而不是循环。但我不知道该怎么做。
如何使用序列从字符串中生成所有子字符串? 谢谢
解决方法
坦率地说,我不知道什么是最有效的方法。我只会使用 for 循环。但这是我对这个问题的解决方案,也许它会帮助你理解序列和这种编写代码的风格:
这里是Playground
fun String.substrings() =
indices.asSequence().flatMap { left ->
(left + 1..length).asSequence().map { right -> substring(left,right) }
}
,
序列并不是特别有效,每个序列都涉及大量开销 - 它们的主要优势是能够一次一个地将每个元素传递给整个操作链。
这意味着您不必为每个中间步骤创建一个全新的元素集合(较低的内存使用量),一旦找到您正在寻找的结果,您就可以提前终止,并且序列可以是无限的。即便如此,它们仍可能比普通列表版本慢,具体取决于您正在使用的内容。
最高效的序列可能是您正在执行的操作,即使用几个 for
循环和 yield
项。但是,如果您的意思是“高效”,例如“使用标准库而不是写出 for 循环”,那么@Furetur 的答案是一种方法,或者您可以使用这样的滑动窗口:
val stuff = "12345"
val substrings = with(stuff) {
indices.asSequence().flatMap { i ->
windowedSequence(length - i)
}
}
print(substrings.toList())
>>>>[12345,1234,2345,123,234,345,12,23,34,45,1,2,3,4,5]
基本上只使用 windowed
(默认为 partialWindows=false
)用于每个可能的子字符串长度,从 length
到 1
,使用所有内容的序列版本
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。