代码之家  ›  专栏  ›  技术社区  ›  Jack

获取子字符串中第一个和最后一个字符的位置

  •  0
  • Jack  · 技术社区  · 7 年前

    我想在OCaml中创建一个函数,返回子字符串中第一个和最后一个字符的位置。例如 my_sub "tar" "ar" 将返回 (1,2) 但如果我有 my_sub "tabr" "ar" 会的 Nil ,它必须是连续的。我该怎么做?

    编辑

    我试图编写代码,但我遇到了一个问题

    let rec pos_sub l t n =
      let rec aux l1 l2 x =
        match l1, l2 with
        | [], _ | _, [] | [], [] -> -1
        | h1::q1, h2 | h1, h2 -> if h1 = h2 then x else -1
        | h1::q1, h2::q2 -> if h1 = h2 then aux q1 q2 x+1 else -1
      in
      match l, t with
      | [], _ -> (-1,-1)
      | h1::q1, h2::q2 -> if h1 = h2 then (n, (aux q1 q2 n+1)) else pos_sub q1 t n+1
    

    上面写着:

    此or模式左侧的变量h1具有“a”类型 但在右边,它有一个“列表” 类型变量“a出现在”列表中

    在年的第二场比赛中 aux

    1 回复  |  直到 7 年前
        1
  •  1
  •   mschmidt    7 年前

    您在代码中的问题是,在此匹配中:

    | h1::q1, h2 | h1, h2 -> if h1 = h2 then x else -1
    

    您尝试比较单个字符 h1 具有 h2 类型为 string . 这就是错误消息试图告诉您的内容。我想你是有意匹配这个案子的 h2 是搜索字符串的最后一个字符,因此:

    | h1::q1, h2:[] | h1:[], h2:[] -> if h1 = h2 then x else -1
    

    因为 q1 未使用,则可以简化为:

    | h1::_, h2:[] -> if h1 = h2 then x else -1
    

    侧节点:这是一种糟糕的风格 -1 或类似于特殊值以指示错误情况。而是在这种情况下使用可选类型。