【问题标题】:Scheme - Manipulating strings方案 - 操作字符串
【发布时间】:2012-03-20 13:24:24
【问题描述】:
我只是从 Scheme 开始。
我正在尝试使用字符串库中的一些程序。
这是我需要的:
输入:“ccaAaAaAa”
功能:生成所有字符串,将所有可能的 aAa 替换为 aBa,仅替换一次
输出:“ccaBaAaAa”和“ccaAaBaAa”和“ccaAaAaBa”
有什么简单的方法可以做到吗?也许是一个返回找到的模式索引列表的程序?
显然搜索函数 string-contains 只返回第一个匹配项。
我的想法是:在生成第一个字符串“ccaBaAaAa”后,修剪到找到的模式的第一个索引:原来的“ccaAaAaAa”变成了“AaAaAa”。重复(递归)。
谢谢。
【问题讨论】:
标签:
string
search
scheme
contains
【解决方案1】:
string-contains 不会为您提供所有出现的子字符串的列表,但它会告诉您是否有一个,如果有,它的索引是什么。它还允许您将搜索限制在字符串中的特定范围内。基于此,如果找到匹配项,则可以递归搜索字符串的其余部分,直到不再找到匹配项。
从那里,您可以为每个匹配项进行替换。
【解决方案2】:
写这样的函数有什么问题?
(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 分钟。
【解决方案3】:
我认为可能存在我不知道的更好的字符串库。但我最终做了我在问题中提出的建议。 (对于一般输入情况)
(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))))
不过还是谢谢!