在一个数组中,对每个字符串中的字符进行排序 - Swift

5

这个问题是上一个问题的后续: swift string permutations allowing the same strings

在那里,我询问了使用定义好的字符串集合可以进行的所有可能变异。接下来我想要做的是过滤掉所有有相同组合但顺序不同的结果。

所以如果输入为:["AB", "AC", "CA", "CB"],输出应该为["AB", "AC", "CB"],因为"AC"和"CA"具有相同的构建块。

所以我的想法是首先按字母表顺序对每个字符串进行排序,然后可能创建一个Set

我已经卡在第一部分了 :(

let array = ["AB", "AC", "DC", "CA", "CB"]
print(type(of: array))
print(array)

let sortedArray = array.map{ $0.sorted() }
print(type(of: sortedArray))
print(sortedArray)

输出结果如下:
Array<String>
["AB", "AC", "DC", "CA", "CB"]
Array<Array<Character>>
[["A", "B"], ["A", "C"], ["C", "D"], ["A", "C"], ["B", "C"]]

我期望得到已排序的数组:

["AB", "AC", "CD", "AC", "BC"]

然后我想把这些单独的字符串拼接在一起:

print(array.map{ $0.joined() } )

导致joined()成员引用不明确。

但我不知道如何解决这个问题。

我还看到了这个:swift sort characters in a string,其中使用了以下代码:

var nonSortedString = "5121"
var sortedString = String(Array(nonSortedString.characters).sort())

但我不知道如何在使用map和相关函数时应用它(在转换为Swift 4后)。

如果有任何帮助,将不胜感激。


听起来你正在尝试构建组合集合,而不是排列。这引出了一个问题,即你是否本来就能够构建组合,而不是先构建排列,然后将其转换/缩减为组合。 - Rob
你说得对 - 组合正是我所需要的,感谢你指出来。 - koen
2个回答

22

如果你想要获取一个字符串,对其字符进行排序,并从中构建一个新的字符串,在Swift 4中可以这样实现:

let string = "foobar"

let sortedString = String(string.sorted())

这导致结果为:

"abfoor"

所以,回到您原来的问题,您可以拿到包含各种排列方式的字符串,并按以下方式构建一个排序后的组合数组:

let permutations = ["AB", "AC", "DC", "CA", "CB"]

// build set of combinations where each string has, itself, been sorted alphabetically

let combinations = Set(permutations.map { String($0.sorted()) })

// convert set (which removed duplicates) back to an array and sort it

let result = Array(combinations).sorted()

结果为:

["AB", "AC", "BC", "CD"]


3

一种不同的方法... 这种解决方案使用了来自 Sequence 协议的另一种 reduce 函数实现。

let reduced = array.map({ String($0.sorted()) }).reduce(into: [String]() ){ (result, element)  -> Void in
    if !result.contains(element)
    {
        result.append(element)
    }
}.sorted()

print(reduced)

结果为...

["AB", "AC", "BC", "CD"]


我喜欢这个(+1)。不过,我正在进行基准测试,并注意到通过使用插入排序而不是在两个不同步骤中减少和排序,可以将性能大致提高一倍。但是,“Array(Set(...))”方法甚至比那还要快一个数量级。 - Rob

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接