2014-02-14 70 views
1

嘿所有我新的F#F#查找字符串的指標在字符數組

我試圖找到一個字符數組字符串的所有出現的起始索引。

例如 char array ['a';'b';'b';'a';'b';'b';'b';'b';'b';'a';'b']

將返回0和3和9,如果你正在尋找字符串「AB」

+1

你能證明你卡在哪裏嗎? –

+0

我試過使用List.FindIndex,但只返回第一個索引 – TJF

+1

它是否應該返回9? – Rodion

回答

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

我不想在這裏做一個完整的例子,所以這裏是提示:

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

+0

讓我找到(l:char seq)i = match Seq.tryFindIndex(fun a - > String.Compare(a,searchSeq)= 0)with | None - > [] | Some ) - > i + t::(找到(Seq.skip tl)(i + t)) 它說沒有不是一個int是真的。我如何允許這個結果? – TJF