如何确定两个无序长字符串数组是否完全相等?

时间:2018-03-19 15:51:41

标签: arrays string algorithm sorting

有两个无序字符串数组,其中包含可重复的多个非常长的字符串。如何确定两个数组是否完全相等?

示例:

[“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", ....]

您可以使用任何语言来解决,但您无法使用库中的函数直接比较数组是否相等。

4 个答案:

答案 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)