Scala中的安全遍历具有更好的复杂性

时间:2016-12-27 13:00:46

标签: scala

我已经实施了" Safe Traversal" Scala中的算法具有 O(n)的复杂性,但我无法提出更复杂的解决方案。想知道是否有人能以更好的时间复杂性提出解决方案。 TIA。

安全遍历

  • 本程序应输入一串字符' S'和' U'在哪里' S'代表安全,' U'代表不安全。第一个字符始终是S,这是遍历开始的位置。目标是编写一个程序,从第一个S移动到数组的末尾,而不会进入U(不安全)块。完成后,程序应该判断是否可以完全从左到右遍历给定阵列。要进行遍历,程序必须使用跳转大小。初始跳转大小应为1(这样一次只能移动一个块)。但跳跃大小可以增加或减少1.跳跃大小永远不会低于1,并且不能从当前大小递增/递减超过1。

  • 对于序列,' SSUSSUSUUS',步骤如下:

    • 程序从最左边开始,S的初始位置1,跳跃大小为1
    • 程序发现下一个块是S,因此不会增加跳转大小并遍历到位置2
    • 程序发现下一个块是U,因此将跳转大小增加到2并移动到位置4
    • 程序发现跳跃大小为2时,位置6的块不安全。因此它将跳跃大小减小到1并且遍历到位置5
    • 程序发现位置6中的块不安全,因此将跳转大小增加到2并遍历到位置7
    • 程序发现位置9中的块不安全,也发现位置8中的块不安全(因此减小跳跃大小将无济于事),因此将跳转大小增加到3并遍历到位置10.因为我们有点击数组的末尾,程序返回说给定序列的安全遍历。

我的解决方案

class SafeTraversal {

  def isTraversalSafe(str: String): Boolean = {

    def compute(jump: Int, ls: List[Char]): List[Char] = ls match {
      case Nil      => Nil
      case x :: Nil => List(x)

      case x :: xs => xs.drop(jump - 1).head match {
        case SafeTraversal.SAFE => compute(jump, xs.drop(jump - 1))
        case SafeTraversal.UNSAFE => {
          if (jump > 1) {
            if (xs.drop(jump - 2).head == SafeTraversal.SAFE) {
              compute(jump - 1, xs.drop(jump - 2))
            }
          }
          xs.drop(jump).head match {
            case SafeTraversal.SAFE   => compute(jump + 1, xs.drop(jump))
            case SafeTraversal.UNSAFE => compute(jump, Nil)
          }
        }
      }
    }

    if (SafeTraversal.isValidInput(str)) {
      compute(1, str.toList) match {
        case Nil => false
        case xs  => true
      }
    } else false
  }
}

object SafeTraversal {
  private final val DEFAULT = "SSUSSUSUUS";

  private final val SAFE = 'S';
  private final val UNSAFE = 'U';

  private def isValidInput(str: String): Boolean = {
    (str filter { _ != 'S' } filter { _ != 'U' }).size == 0
  }

  def main(args: Array[String]): Unit = {
    val safeTraversal = new SafeTraversal()

    val str = if (args.length > 0) args(0) else DEFAULT
    val res = safeTraversal.isTraversalSafe(str)

    res match {
      case true  => println(s"""Safe traversal is possible for string "$str"!""")
      case false => println(s"""Safe traversal is not possible for string "$str"!""")
    }

  }
}

0 个答案:

没有答案