【问题标题】: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))))
      

      不过还是谢谢!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多