【问题标题】:How to compare two Strings to check if they have same Characters Swift 4?如何比较两个字符串以检查它们是否具有相同的字符 Swift 4?
【发布时间】:2018-09-14 09:34:45
【问题描述】:

我在 HackerEarth 上玩耍时遇到了这个问题。

我尝试做的是比较字符串并检查它们是否具有相同的字符。

var string = ""

while let thing = readLine() 
{ 
string += thing + " "
}

var arrayStr = string.split(separator: " ").map{String(($0))}

var firstString = [String]()

var secondString = [String]()

var cas = arrayStr[0]

for i in 1..<arrayStr.count
{
if i % 2 != 0 
{
    firstString.append(String(arrayStr[i]))
}
else
{
    secondString.append(String(arrayStr[i]))
}
}
print(firstString) //["sumit", "ambuj", "abhi"]


print(secondString) //["mitsu", "jumba", "hibb"]

所以,现在您可以看到firstStringsecondString 的第一个索引包含相同的字符,第二个索引相同,但最后一个索引不同。

那么,我该如何比较它们呢?我尝试了 NSCharacter,但 HackerEarth 没有接受它。有什么想法吗?

【问题讨论】:

标签: swift logic swift4


【解决方案1】:

如果“多重性”很重要(即“aab”与“aba”有相同的字符, 但不是与“abb”相同的字符),那么

s1.sorted() == s2.sorted()

成功了。如果您不关心多样性,那么只需

Set(s1) == Set(s2)

例子:

let firstArray = ["sumit", "ambuj", "abhi", "aba"]
let secondArray = ["mitsu", "jumba", "hibb", "abb"]

for (s1, s2) in zip(firstArray, secondArray) {
    print(s1.sorted() == s2.sorted())
}

// true, true, false, false

for (s1, s2) in zip(firstArray, secondArray) {
    print(Set(s1) == Set(s2))
}

// true, true, false, true

对于较长的字符串,维护 dictionary 中每个字符出现的次数 一个字符串(类似于NSCountedSet):

func characterCounts(_ s: String) -> [Character: Int] {
    return s.reduce(into: [:], { $0[$1, default: 0] += 1 })
}

然后比较字典:

characterCounts(s1) == characterCounts(s2)

【讨论】:

  • 感谢您的帮助。
  • @Martin - 这里的多重性是什么意思?
  • @Nawaz:“aba”和“abb”具有相同的字符(“a”和“b”),但具有不同的多重性。
  • @Rob13:不客气——我添加了另一个选项。
【解决方案2】:

一种优雅的方式可能是:

extension String {
    func haveSameCharecterSet(_ str : String) -> Bool {
            return self.sorted() == str.sorted()
    }
}

可以这样使用:

var str1 = "ABCD"
var str2 = "CDBA"
print(str1.haveSameCharecterSet(str2));
//true

【讨论】:

  • 嘿,抱歉,我不知道 HackerEarth 是否选择了扩展程序。但是,我猜这对其他人会有所帮助。
  • 这应该写成return self.sorted() == str.sorted()
  • 完全接受。将更新它。感谢您的建议。
  • @Rob13 - 虽然我不确定,但我认为 HackerEarth 应该将扩展作为 swift 本身的一部分。
  • 他们甚至没有选择 CharacterSet
【解决方案3】:

如果我们处理“复杂”的字符串,我发现这个解决方案会更快。

func isCharactersTheSame(s1: String, s2: String) -> Bool {
    return Set(s1).symmetricDifference(Set(s2)).count == 0 
}

例如,如果我们将 "aaaaaaaaa" 和 "a" 比较 100 次,那么 s1.sorted() == s2.sorted() 更快 但在比较 "aaaaaaaaaa" 和 "a" Set(s1).symmetricDifference(Set(s2)).count == 0 会赢

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-10
    • 1970-01-01
    • 2014-03-22
    • 1970-01-01
    • 1970-01-01
    • 2013-08-21
    • 1970-01-01
    相关资源
    最近更新 更多