如何编写一个打印给定字符串中所有可能字符串的函数?

时间:2011-02-20 16:24:20

标签: scala

我正在尝试编写执行以下操作的代码:  1.有一个字符串“abc”  2.it打印出所有可能的字符串:abc,bac,cba,acb,cab,bca

以下是我编写的代码,但它始终出错:

def swap(n: Int, source: String): String = {
  val new_array = source.toCharArray
  if (n == 1) {
    new_string
  } else {
    var letter = new_array(n)
    letter = new_array(n-1)
    new_array(n-1) = letter
    var k = new String(new_array)
    swap(n, source)
  }
}

你能告诉我我的错误在哪里吗?

提前谢谢。

5 个答案:

答案 0 :(得分:3)

scala> "abc".permutations.toList
res1: List[String] = List(abc, acb, bac, bca, cab, cba)

我不会转过那个。

答案 1 :(得分:2)

非常明显的错误是你的名字全部混淆了。

我可以看到new_array已初始化,但之后您尝试使用new_string,这似乎不是来自任何地方。

答案 2 :(得分:1)

一个显而易见的事情是你试图交换两个字母,但你的订单错了。它应该是

val letter = new_array(n)
new_array(n) = new_array(n-1)
new_array(n-1) = letter

可能还有其他错误,但因为这是家庭作业......

答案 3 :(得分:0)

如前所述,这是一个排列问题。使用Scala 2.8,您可以编写类似的内容:

def permut[T](l: List[T]): List[List[T]] = {
  def retire(e: T, l: List[T]): List[T] = l match {
    case Nil                => Nil
    case x::xs if e == x    => xs
    case x::xs              => x::retire(e, xs)
  }

  l match {
    case Nil => List(Nil)
    case _   => for ( x <- l; p <- permut(retire(x, l))) yield (x :: p)
  }
}

然后:

scala> permut("abc" toList) map {_.mkString }                              
res11: List[String] = List(abc, acb, bac, bca, cab, cba)

(我不确定我的排列是否是最优的。至少,退休可能是尾递归的)

答案 4 :(得分:0)

您想要编写一个next_permutation函数,其操作可以总结如下:查找数组的最长后缀,按降序排列 - 假设它从索引m开始。找出索引m-1的值在该后缀中的位置,并交换这两个值。然后将后缀从m反转到列表的末尾,以便按顺序排列。