我已经实施了" Safe Traversal" Scala中的算法具有 O(n)的复杂性,但我无法提出更复杂的解决方案。想知道是否有人能以更好的时间复杂性提出解决方案。 TIA。
本程序应输入一串字符' S'和' U'在哪里' S'代表安全,' U'代表不安全。第一个字符始终是S
,这是遍历开始的位置。目标是编写一个程序,从第一个S
移动到数组的末尾,而不会进入U
(不安全)块。完成后,程序应该判断是否可以完全从左到右遍历给定阵列。要进行遍历,程序必须使用跳转大小。初始跳转大小应为1(这样一次只能移动一个块)。但跳跃大小可以增加或减少1.跳跃大小永远不会低于1,并且不能从当前大小递增/递减超过1。
对于序列,' SSUSSUSUUS',步骤如下:
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"!""")
}
}
}