我刚开始使用Scheme。
我正在尝试使用String Library中的一些过程。
这就是我需要的:
输入:“ccaAaAaAa”
功能:生成所有字符串,将所有可能的aAa替换为aBa,仅一个替换
输出:“ccaBaAaAa”和“ccaAaBaAa”和“ccaAaAaBa”
有没有简单的方法呢?也许是一个返回模式索引列表的过程?
显然搜索功能string-contains只返回第一次出现。
我的想法是:在产生第一个字符串“ccaBaAaAa”之后,修剪到找到的模式的第一个索引:原始的“ccaAaAaAa”变成“AaAaAa”。重复(递归)。
感谢。
答案 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))))
但无论如何,谢谢!