嘿,我是F#
的新手我试图找到char数组中所有字符串出现的起始索引。
e.g。 char数组['a';'b';'b';'a';'b';'b';'b';'b';'b';'a';'b']
如果您搜索字符串“ab”,将返回0和3以及9
答案 0 :(得分:2)
这是使用递归函数的解决方案:
/// Wraps the recursive findMatches function defined inside, so that you don't have to seed it with the "internal" paramters
let findMatches chars str =
/// Returns whether or not the string matches the beginning of the character array
let rec isStartMatch chars (str: string) =
match chars with
| char :: rest when str.Length > 0 ->
char = str.[0] && (isStartMatch rest str.[1..(str.Length - 1)])
| _ -> str.Length = 0
/// The actual function here
let rec findMatches matchedIndices i chars str =
match chars with
| _ :: rest ->
if isStartMatch chars str
then findMatches (i :: matchedIndices) (i + 1) rest str
else findMatches matchedIndices (i + 1) rest str
| [] -> matchedIndices
findMatches [] 0 chars str
不是效率最高的,因为如果它们是匹配的一部分,它会对字符进行两次迭代,但这并不是一个很大的担忧。
答案 1 :(得分:1)
我不想在这里做一个完整的例子,所以这里有提示:
let rec match (l:char seq) i=
match seq.tryFindindex ... (*the part you have already done goes here*)with
|None -> []
|Some(t) ->i+t::(match (Seq.skip t l) (i+t)
基本上,我们只是重复应用Findindex
,直到它停止匹配。