f#在char数组中查找字符串的索引

时间:2014-02-14 10:52:08

标签: f#

嘿,我是F#

的新手

我试图找到char数组中所有字符串出现的起始索引。

e.g。 char数组['a';'b';'b';'a';'b';'b';'b';'b';'b';'a';'b']

如果您搜索字符串“ab”

将返回0和3以及9

2 个答案:

答案 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,直到它停止匹配。