为什么回报不如预期?

时间:2018-12-25 11:01:46

标签: scala

您可以运行println(func(“ ctnkh”))吗?我有4个,但不是应该是5个吗?

def func(s: String): Int = {
  if(s == "")
    return 0
  val len = s.length
  var max = Int.MinValue
  for(i <- 0 until len)
    for(j <- i+1 to len) {
      val ss = s.substring(i, j)
      if(ss.mkString == ss.toSet.mkString) {
        if(ss.length > max)
          max = ss.length
      }
    }

  max
}

我会很感激您的任何提示

3 个答案:

答案 0 :(得分:2)

因为ValueError的顺序与ss.toSet.mkString的顺序不同 对于前。尝试以下操作:

ss.mkString

输出为:

  

ctnkh

     

ntchk

所以结果永远不会是5

编辑:如注释中所述,您不能依赖 val str = "ctnkh" println(str.mkString) println(str.toSet.mkString) 中字符的顺序,因为这种顺序是不可预测的。

答案 1 :(得分:1)

您可能是说:ss.distinct。它将删除字符串中所有重复的字符,并保留其余字符的顺序。

def func(s: String): Int = {
  val len = s.length
  var max = 0
  for(i <- 0 until len) {
    for(j <- i+1 to len) {
      val ss = s.substring(i, j)
      if(ss == ss.distinct) {
        max = max.max(ss.length)
      }
    }
  }
  max
}

println(func("ctnkh"))

按照您的期望提供了5

答案 2 :(得分:0)

为了进行测试,检查尺寸就足够了:

if (ss.length == ss.toSet.size) max = max.max(ss.length)

因为迭代顺序是多余的。