嘿所有我新的F#F#查找字符串的指標在字符數組
我試圖找到一個字符數組字符串的所有出現的起始索引。
例如 char array ['a';'b';'b';'a';'b';'b';'b';'b';'b';'a';'b']
將返回0和3和9,如果你正在尋找字符串「AB」
嘿所有我新的F#F#查找字符串的指標在字符數組
我試圖找到一個字符數組字符串的所有出現的起始索引。
例如 char array ['a';'b';'b';'a';'b';'b';'b';'b';'b';'a';'b']
將返回0和3和9,如果你正在尋找字符串「AB」
下面是一個使用遞歸功能的解決方案:
/// 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
不是最有效的,因爲它遍歷字符兩次,如果他們是比賽的一部分,但是這不是一個真正的心腹大患。
我不想在這裏做一個完整的例子,所以這裏是提示:
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
,直到它停止匹配。
讓我找到(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
你能證明你卡在哪裏嗎? –
我試過使用List.FindIndex,但只返回第一個索引 – TJF
它是否應該返回9? – Rodion