【问题标题】:Is this a wrong approach to find whether array is subarray of another array?这是查找数组是否是另一个数组的子数组的错误方法吗?
【发布时间】:2021-11-08 02:16:22
【问题描述】:
bool isSubset(int arr1[], int m,int arr2[], int n){
    set<int> hashset;
    for (int i = 0; i < m; i++){
        hashset.insert(arr1[i]);
    }
    for (int i = 0; i < n; i++) {
        if (hashset.find(arr2[i]) == hashset.end())
            return false;
    }
    return true;
}

这是查找arr2 是否是arr1 的子数组的正确方法吗 因为子数组是数组的连续部分,但是这段代码没有检查任何顺序,这就是我想确定的原因。

【问题讨论】:

  • 试试看。您似乎很清楚要尝试的测试用例。
  • 取决于“子数组”的含义 - 这不是一个具有通用定义的术语。如果arr2 的所有元素都是arr1 的元素,则您的函数返回true。如果您想检查arr2 的所有元素的序列是否作为arr1 中的序列出现,那么您的功能不符合您的要求。比如arr1 = {1,2,3,4}arr2={3,2}会根据你的函数测试为真,但是{3,2}序列不在arr1中。
  • 子数组是数组的连续部分,就像子字符串
  • std::search 是一个东西。此外,std::set 是树集,而不是哈希集。

标签: c++ arrays data-structures sub-array


【解决方案1】:

判断 arr2 是否是 arr1 的子数组是否正确?

不,不是。您的方法不考虑元素的顺序。它更多的是一种查找arr1中是否存在一堆数字(在arr2中给出)的方法。

例如,如果int arr1[] = {1, 2, 3}int arr2[] = {2, 1},你实现的方法将返回true,而它应该返回false

你会怎么做:

#include <iostream>

bool isSubset(int array[], int m, int subarray[], int n)
{
    if (n > m)
        return false;
    
    for (int i = 0; i <= m-n; i++) {
        int ii = i, j;
        for (j = 0; j < n; j++)
            if (subarray[j] != array[ii])
                break;
            else
                ii++;
        
        if (j == n)
            return true;
    }
    
    return false;
}

然后这样称呼它:

int main()
{
    int array[] = {1, 2, 3};
    const int m = sizeof(array) / sizeof(*array);
    
    int subarray1[] = {1, 2};
    const int n1 = sizeof(subarray1) / sizeof(*subarray1);

    int subarray2[] = {2, 1};
    const int n2 = sizeof(subarray2) / sizeof(*subarray2);
    
    std::cout << isSubset(array, m, subarray1, n1) << "\n"; // Will print 1
    std::cout << isSubset(array, m, subarray2, n1) << "\n"; // Will print 0
}

【讨论】:

    【解决方案2】:

    你明白你的代码检查子数组的方式是错误的。

    一个建议-

    不鼓励在C++ 中使用C 语言样式数组。相反,您应该使用Containers library 中提供的适当标准容器。您可以使用 std::array 容器代替普通的 C 样式数组。下面是检查子数组的示例代码:

    #include <iostream>
    #include <array>
    #include <algorithm>
    
    int main () {
        std::array<int,12> arr1 {9,5,2,5,9,2,4,7,0,4,5,1};
        std::array<int,3> arr2 {5,9,2};
        bool res = false;    
        size_t pos = 0;
        std::array<int,12>::iterator x;
    
        while ((x = std::find(arr1.begin() + pos, arr1.end(), arr2[0])) != arr1.end()) {
            size_t currpos = x - arr1.begin();
    
            if ((arr1.size() - currpos >= arr2.size()) &&
               ((std::equal(arr1.begin() + currpos, arr1.begin() + currpos + arr2.size(), arr2.begin())))) {
                res = true;
                break;
            }
    
            pos = currpos + 1;
        }
    
        if (res) {
            std::cout << "arr2 is subarray of arr1" << std::endl;
        } else {
            std::cout << "arr2 is not subarray of arr1" << std::endl;
        }
    
        return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 2010-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-20
      • 2019-11-12
      • 2012-08-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多