有两个无序字符串数组,其中包含可重复的多个非常长的字符串。如何确定两个数组是否完全相等?
示例:
[“abc”, "abc", "bcd", "efg"] == ["bcd", "efg", “abc”, "abc"]
我能想到的最简单的方法是在排序后比较两个数组。
但是当数组中的每个字符串都很长时,每次执行字符串比较都很耗时。有没有办法改善它?
let array1 = ["aaa...(100 a)...aa", "bbb...(100 b)... bbb", "ccc...(100c) ...c", ....]
let array2 = ["bbb...(100 b)... bbb", "aaa...(100 a)...aa", "ccc...(100c) ...c", ....]
您可以使用任何语言来解决,但您无法使用库中的函数直接比较数组是否相等。
答案 0 :(得分:1)
如果是在Python中:
import collections
def areItersEqual(a1, a2):
return collections.Counter(a1) == collections.Counter(a2)
>>> a1 = [“abc”, "abc", "bcd", "efg"]
>>> a2 = ["bcd", "efg", “abc”, "abc"]
>>> assert areItersEqual(a1,a2) is True
True
有了这个,时间和空间的上限是O(m + n),而O(n logn)+ O(m logm)时间是排序。
这也可以在没有Counter()
的情况下编写:
def areItersEqual(a1, a2):
c = {}
for word in a1:
if word in c:
c[word] += 1
else:
c[word] = 0
for word in a2:
if word in c:
c[word] -= 1
else:
return False
return not(bool([v for k,v in c.items() if v!=0]))
答案 1 :(得分:0)
您可以获取每个字符串的哈希值并进行比较,而不是对字符串进行排序。 (这些你可能想要排序。)
但是,如果哈希值相等,这仍然需要您直接比较字符串,因为哈希冲突可能会产生误报。
答案 2 :(得分:0)
只需使用Javascript检查以下代码:)
...
.then(user => {
this.authState = user;
// Here i want get user data and set it to my variable
this.userData = this.afs.collection('Users').document(user.uid);
this.router.navigate(['/']);
})
答案 3 :(得分:0)
func test() -> Bool {
var a1 = ["abc", "abc", "bcd", "efg"]
var a2 = ["bcd", "efg", "abc", "abc"]
if a1.count != a2.count {
return false
}
var temp = [String: Int]()
for ele in a1 {
if let count = temp[ele] { // if temp contain key
temp[ele] = count + 1
} else {
temp[ele] = 1
}
}
for ele in a2 {
if let count = temp[ele] { // if temp contain key
if count == 0 {
return false
} else if count == 1 {
temp[ele] = nil
} else {
temp[ele] = count - 1
}
} else {
return false
}
}
return temp.count == 0
}
print(test())
此功能只能通过枚举两个数组来解决。为O(n)