find
并且canFind
支持可变数量的针,因此使用它们是最简单的:
"aabbccddffgg".canFind("bb", "cc");
Run Code Online (Sandbox Code Playgroud)
在此处了解有关std.algorithm.searching.canFind的更多信息.如果您在编译时不知道针数,则取决于您对字符串的了解程度,但天真的方法是在字符串上多次循环:
auto eles = ["bb", "cc"];
eles.any!(e => "aabbccddffgg".canFind(e)))
Run Code Online (Sandbox Code Playgroud)
如果您对子元素有更多了解,那么有更好的方法.例如,如果您知道所有针的长度均为n,则可以创建一个大小为n的滑动窗口,并检查您的针是否出现在其中一个滑动窗口中:
auto eles = ["bb", "cc"];
"aabbccddffgg".slide(2).canFind!(e => eles.canFind!equal(e));
Run Code Online (Sandbox Code Playgroud)
在此处了解有关std.range.slide的更多信息.同样的想法也适用于一般情况:
auto eles = ["bb", "cc"];
string s = "aabbccddffgg";
s.enumerate
.map!(e => s.drop(e.index))
.canFind!(e => eles.canFind!(reverseArgs!startsWith)(e));
Run Code Online (Sandbox Code Playgroud)
注意,drop
使用切片并在O(1)中懒惰地发生而没有任何内存分配.
当然,还有更高效的方法和更先进的字符串匹配算法.
归档时间: |
|
查看次数: |
80 次 |
最近记录: |