Scheme - 操作字符串

时间:2012-03-02 00:56:09

标签: string search scheme contains

我刚开始使用Scheme。

我正在尝试使用String Library中的一些过程。

这就是我需要的:

  

输入:“ccaAaAaAa”

     

功能:生成所有字符串,将所有可能的aAa替换为aBa,仅一个替换

     

输出:“ccaBaAaAa”和“ccaAaBaAa”和“ccaAaAaBa”

有没有简单的方法呢?也许是一个返回模式索引列表的过程?

显然搜索功能string-contains只返回第一次出现。

我的想法是:在产生第一个字符串“ccaBaAaAa”之后,修剪到找到的模式的第一个索引:原始的“ccaAaAaAa”变成“AaAaAa”。重复(递归)。

感谢。

3 个答案:

答案 0 :(得分:0)

string-contains不会为您提供所有子字符串出现的列表,但它会告诉您是否存在子字符串,以及是否存在其索引。它还允许您将搜索限制在字符串中的特定范围内。基于此,如果你得到一个匹配,你可以递归搜索其余的字符串,直到你不再获得匹配。

从那里,你可以替换每场比赛。

答案 1 :(得分:0)

编写这样的函数有什么问题?

(define (replace input)
  (let loop ((done '())
             (remaining (string->list input))
             (output '()))
    (if (pair? remaining)
        (if (char=? #\a (car remaining))
            (let ((remaining (cdr remaining)))
              (if (pair? remaining)
                  (if (char=? #\A (car remaining))
                      (let ((remaining (cdr remaining)))
                        (if (pair? remaining)
                            (if (char=? #\a (car remaining))
                                (loop (append done (list #\a #\A))
                                      remaining
                                      (cons (list->string
                                             (append done
                                                     (cons #\a
                                                           (cons #\B
                                                                 remaining))))
                                            output))
                                (loop (append done (list #\a #\A
                                                         (car remaining)))
                                      (cdr remaining)
                                      (reverse output)))
                            (reverse output)))
                      (loop (append done (list #\a (car remaining)))
                            (cdr remaining)
                            (reverse output)))
                  (reverse output)))
            (loop (append done (list (car remaining)))
                  (cdr remaining)
                  (reverse output)))
        (reverse output))))

(replace "ccaAaAaAa") ;=> ("ccaBaAaAa" "ccaAaBaAa" "ccaAaAaBa")

大约15分钟的工作时间。

答案 2 :(得分:0)

我认为可能有更好的字符串库,我不知道。但我最终做了我在问题中提出的建议。 (对于一般输入案例)

(define (aplicarRegra cadeia cadeiaOriginal regra n)
  (let* ((antes (car regra))
         (depois (cdr regra))
         (index (string-contains cadeia antes))
         (tamanho (string-length antes))
         (diferenca (- (string-length cadeiaOriginal) (string-length cadeia))))

    (if index
       (let* ((cadeiaGerada (string-replace cadeiaOriginal depois (+ index diferenca) (+ index diferenca tamanho))))

          (if(<= (string-length cadeiaGerada) n)
             (lset-union equal? (list cadeiaGerada) (aplicarRegra(substring cadeia (+ 1 index)) cadeiaOriginal regra n))
             (aplicarRegra (substring cadeia (+ 1 index)) cadeiaOriginal regra n)))
       (list))))

但无论如何,谢谢!