2017-07-08 36 views
1

我正在解决学习Scala的琐碎问题。这是我想出的在Scala中实现一个算法来确定一个字符串是否具有所有唯一字符

def isUnique(str: String): Boolean = { 
    if (str.length > 128) return false 
    val uniqueChars = new Array[Boolean](128) 

    !(str.map(c => addChar(c, uniqueChars)).find(identity).isDefined) 
} 

def addChar(ch: Char, uniqueChars: Array[Boolean]): Boolean = { 
    if (uniqueChars(ch)) return true else { 
    uniqueChars(ch) = true; 
    return false 
} 

是这样吗?

请注意,我不关心逻辑或优化在这一点上。我只需要学习Scala的做法。

[编辑] 让我们假设我们不想使用字符串distinct方法。我只需要验证Scala的功能风格。

+6

'str.length == str.distinct.length' – jwvh

+0

请参阅https://stackoverflow.com/questions/22834018/scala-function-test-a-string-for-unique-char – frozen

+0

糟糕!这更直接:'str == str.distinct' – jwvh

回答

4

好的,所以如果你不想使用distinct库方法,那么递归通常是功能的方法。

def isUnique(str: String, chrs: Set[Char] = Set()): Boolean = 
    str.length == 0 || 
    !chrs(str.head) && 
     isUnique(str.tail, chrs + str.head) 

isUnique("abcdexf") // true 
isUnique("abcdxxf") // false 
isUnique("fbcdexf") // false 
isUnique("abdbexf") // false 
+0

漂亮华丽!花了一分钟,让我的头,虽然。谢谢! – Programmer

-3

你想“学做的斯卡拉方式”,通过实际做的方式,这是没有意义的斯卡拉使用?斯卡拉这样做的方式str == str.distinct。如果“你不想使用distinct”,那么str.toSet.size == str.length。如果你不想要toSet,那么str.groupBy(identity).values.map(_.size).forall(_ == 1)。 如果你不想.groupBy然后 str.sorted.sliding(2).forall(s => s.head != s.last)

...等在某些时候做,“斯卡拉办法”只是不再是“斯卡拉方式”,成为用Scala编写语法的Java程序。

+0

我不想让它成为Java。我想知道你将如何在Scala中实现不同的方法。我相信它没有使用Java或groupBy或排序来实现。请参阅上面的接受答案。 (仅供参考,我没有投票答复)。 – Programmer

相关问题