C语言判断输出的每个组合是另一个数组的子集

C语言:我编了一个函数“数组”输出“组合”的小程序,但是我想让这个函数输出“组合”中的每一个“组合”与另外一个“数组”比较,看是不是它的子集,不会编了,请教,谢谢!
我编的程序:

#include "stdio.h"
void printCombination(int*arr,const int length,int start,int getcount,int*tempArr,const int tempLength,int*total)
{
    if(getcount==0)
    {
        (*total)++;
        for(int index=0;index<tempLength;index++)
        {
            printf("%d",tempArr[index]);
        }
        printf("\n");
        return;
    }
    if(getcount>(length-start)||tempLength<getcount||getcount<1)
    {
        return;
    }
    for(int i=start;i<length;i++)
    {
        tempArr[tempLength-getcount]=arr[i];
        printCombination(arr,length,i+1,getcount-1,tempArr,tempLength,total);
    }
}
int main(int argc,char argv[])
{
    int a = 0;
    int*total=&a;
    int arr[]={1,2,3,4,5,6};
    int temp[3];
    printCombination(arr,6,0,4,temp,4,total);
    printf("total:%d\n",(int)*total);
}
输出结果:
1234
1235
1236
1245
1246
1256
1345
1346
1356
1456
2345
2346
2356
2456
3456
total:15



             Press any key to continue


我要实现的是输出的每一个组合,判断是否是另一个数组的子集(另一个数组如:int[]={4,5,6,7,8,9})。

int issubset(int big[], int n, int small[], int m) 
{
    int i, j;

    for (i = 0; i < m; i++) {
        int isFound = 0;

        for (j = 0; j < n; j++) {
            if (small[i] == big[j]) {
                isFound = 1;
                break;
            }
        }

        if (!isFound) {
            return 0;
        }
    }

    return 1;
}

要考虑存在重复元素的话,代码还需要修改下

int issubset(int big[], int n, int small[], int m) {
    int i, j;
    int isMatched[n] = { 0 };

    // 初始化标记数组为0
    for (i = 0; i < n; i++) {
        isMatched[i] = 0;
    }

    for (i = 0; i < m; i++) {
        int isFound = 0;

        for (j = 0; j < n; j++) {
            if (small[i] == big[j] && isMatched[j] == 0) {
                isFound = 1;
                isMatched[j] = 1; /
                break;
            }
        }

        if (!isFound) {
            return 0;
        }
    }
    return 1;
}

不会编就对了
因为你现在直接print了,根本没有返回子集
你怎么去拿print出来的东西去和另一个数组比呢
你好歹先返回一个二维数组呀

新增了:

  1. arr2 数组作为比较数组
  2. contains() 方法判断数组是否包含某值
  3. 在 printCombination() 中对每个组合与 arr2 比较并输出判断结果
int arr2[] = {1, 2, 3}; 

void printCombination(int*arr,const int length,int start,int getcount,int*tempArr,const int tempLength,int*total)
{
    // ... 省略不变代码
    
    for(int index=0;index<tempLength;index++)
    {
        printf("%d",tempArr[index]);
    }
    
    // 新增代码:遍历 arr2 判断是否子集
    int isSubset = 1; 
    for (int i = 0; i < getcount; i++) {
        if (!contains(arr2, tempArr[i])) {
            isSubset = 0;
            break;
        }
    }
    
    printf("%s\n", isSubset ? "是子集" : "不是子集"); 
}

// 新增方法判断数组是否包含某值 
int contains(int arr[], int val) {
    for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++) {
        if (arr[i] == val) {
            return 1;
        }
    }
    return 0;
}
  • 以下回答由chatgpt基于相关博客总结生成:

    根据你提供的代码片段,无法完全理解你所描述的问题。你所提供的代码片段似乎与最长公共子序列的问题无关。因此,我建议你提供更多的代码片段和问题描述,以便我能够更好地帮助你解决问题。

    同时,参考资料中提到了如何计算两个序列的最长公共子序列的长度,你可以根据这个方法来实现你的需求。下面是一个示例的Python代码:

    def longest_common_subsequence(x, y):
        """计算两个序列的最长公共子序列的长度"""
        m, n = len(x), len(y)
        # 创建一个二维数组来保存中间结果
        dp = [[0] * (n+1) for _ in range(m+1)]
    
        # 计算dp[i][j],表示x[:i]和y[:j]的最长公共子序列的长度
        for i in range(1, m+1):
            for j in range(1, n+1):
                if x[i-1] == y[j-1]:
                    dp[i][j] = dp[i-1][j-1] + 1
                else:
                    dp[i][j] = max(dp[i-1][j], dp[i][j-1])
    
        return dp[m][n]
    
    
    def is_subset(subset, array):
        """判断subset是否是array的子集"""
        for value in subset:
            if value not in array:
                return False
        return True
    
    
    # 示例用法
    x = [1, 2, 3, 4]
    y = [1, 3]
    lcs_length = longest_common_subsequence(x, y)
    is_subset = is_subset(y, x)
    print("最长公共子序列的长度:", lcs_length)
    print("y是否是x的子集:", is_subset)
    

    这段代码中,longest_common_subsequence函数使用动态规划的方法计算两个序列的最长公共子序列的长度,而is_subset函数则判断给定的一个子序列是否是另一个序列的子集。你可以根据这个代码来实现你的需求,根据你所提供的代码片段无法给出更具体的解决方法。希望对你有帮助!如果还有其他问题,请提供更多的信息。