【问题标题】:Removing repeated characters from a string in scheme从方案中的字符串中删除重复字符
【发布时间】:2011-09-04 09:09:49
【问题描述】:

我已经尝试这个问题很长时间了,但并没有走得太远。问题是要求生成一个字符串,其中输入字符串中的所有重复字符都替换为该字符的单个实例。

例如,

(remove-repeats "aaaab") => "ab"
(remove-repeats "caaabb aa") => "cab a"

由于我正在尝试使用累积递归来做到这一点,所以到目前为止我有:

(define (remove-repeats s) 
  (local
    [(define (remove-repeats-acc s1 removed-so-far)
      (cond
        [(empty? (string->list s1))""]
        [else 
         (cond
           [(equal? (first (string->list s1)) (second (string->list s1))) 
         (list->string (remove-repeats-acc (remove (second (string->list s1)) (string->list s1)) (add1 removed-so-far)))]
           [else (list->string (remove-repeats-acc (rest (string->list s1)) removed-so-far))])]))]
    (remove-repeats-acc s 0)))

但这似乎不对。请帮我修改它以使其正常工作。

谢谢!!

【问题讨论】:

  • 请将您的代码放在代码块中,适当缩进,以便于阅读。
  • 您可以通过在每行之前添加至少四个空格以及在适当的地方开始新行来使代码看起来更漂亮。

标签: string recursion scheme


【解决方案1】:

使用字符串有点烦人,所以我们将它包裹在一个处理列表的工作函数中。这样我们就可以避免到处乱搞转换。

(define (remove-repeats str)
  (list->string (remove-repeats/list (string->list str))))

现在我们可以使用简单的递归来定义 remove-repeats/list 函数:

(define (remove-repeats/list xs)
  (cond
    [(empty? xs) xs]
    [(empty? (cdr xs)) xs]
    [(equal? (car xs) (cadr xs)) (remove-repeats/list (cdr xs))]
    [else (cons (car xs) (remove-repeats/list (cdr xs)))]))

这不是尾递归,但现在添加累加器应该更容易:

(define (remove-repeats str)
  (list->string (remove-repeats/list-acc (string->list str) '())))

(define (remove-repeats/list-acc xs acc)
  (cond
    [(empty? xs) (reverse acc)]
    [(empty? (cdr xs)) (reverse (cons (car xs) acc))]
    [(equal? (car xs) (cadr xs)) (remove-repeats/list-acc (cdr xs) acc)]
    [else (remove-repeats/list-acc (cdr xs) (cons (car xs) acc))]))

【讨论】:

  • 谢谢!!真的很感激
【解决方案2】:

这是我喜欢的版本,Typed Racket

#lang typed/racket
(: remove-repeats : String -> String)
(define (remove-repeats s)
  (define-values (chars last)
    (for/fold: ([chars : (Listof Char) null] [last : (Option Char) #f])
      ([c (in-string s)] #:when (not (eqv? last c)))
      (values (cons c chars) c)))
  (list->string (reverse chars)))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-08
    • 1970-01-01
    • 2020-03-30
    • 2013-08-12
    • 2018-02-20
    • 1970-01-01
    相关资源
    最近更新 更多