检查是否可以通过连接较小的字符串来生成字符串

时间:2015-09-29 08:14:27

标签: c algorithm

如何通过连接'n'其他字符串来检查字符串是否完全可以用,其中 n 是变量?

例如:

catdogmice由字符串catdogmice组成 但catdogmices不是

编辑1:这是我写的代码(对不起,我在编码方面没有根据,并且制作了相当糟糕的代码并且它给出了段错误)

#include<stdio.h>
#include<string.h>
char words[1001][11];
char* str;
int flag;
void autopsy(char* str, int m)
{

        if(strcmp(str,'\0')==0)
                flag = 1;
        int len, i;
        for(i = 0; i < m; i++)
        {
                len = strlen(words[i]);
                if(strncmp(words[i], str, len)==0)
                {
                        *str += len;
                        autopsy(str, m);
                }
        }
        if(flag == 1)
                printf("YES\n");
        else
                printf("NO\n");
}

int main()
{
        int m, l, i;
        scanf("%d %d", &m, &l);
        for(i = 0; i < m; i++)
                scanf("%s", words[i]);
        int t;
        scanf("%d", &t);
        while(t--)
        {
                flag = 0;
                gets(str);
                autopsy(str, m);
        }
        return 0;
}

首先,我读取较小单词的数量和较小单词的最大长度。然后是我接受检查的较大字符串的数量,然后如果可以形成则输出。我怎样才能确保如果大词是 catsdog 而我的话是 cat ,然后删除第一个 cat ,然后 sdog 无法删除,答案为否,但实际答案是肯定的。

Edit2 :是否可以使用数据结构TRIE解决?

3 个答案:

答案 0 :(得分:5)

注意:此解决方案假定您可以多次使用这些单词。

您可以使用dynamic programming方法执行此操作。将子问题定义为“可以从给定字符串组成从位置i开始的初始字符串的后缀”。 DP将是一维的,因此我假设您将子问题结果存储在大小为n的数组dp中(其中n是初始字符串的大小)。在eaech细胞商店中,单个标志 - 是否可以形成给定的后缀。

现在要解决给定索引i的问题,请执行以下操作 - 如果w j 是前缀,则迭代所有单词并为每个单词w j 进行迭代如果dp [i + len(w j )]为1,则从位置i开始的初始字符串的后缀,然后将dp [i]设置为1。

让它更容易理解。假设我们有字符串s 0 s 0 s 1 ... s i s i + 1 内容S <子>名词。要计算dp [i],迭代所有单词。如果w j 不是s i s i + 1 的前缀,假设我们当前正在使用单词w j ... s n (即w j [0] == s i ,w j [1] == s i + 1 等等)什么都不做。否则检查dp [i + strlen(w j )]是否为1,然后将dp [i]设置为1并停止迭代而不是其他单词。

该方法将具有线性内存开销,其计算复杂度将为n * m * max_word_len,其中m是字数,max_word_len是允许的最大字长。

答案 1 :(得分:1)

如果可以通过连接较小的字符串来生成字符串,则至少一个较小的字符串必须是较大字符串的前缀。对于每个匹配的前缀,从输入字符串中删除它并递归。我没有前缀,剩下的输入字符串是空的,你找到了解决方案。

答案 2 :(得分:0)

Ivaylo Strandjev的答案比我的答案更有效率和清洁。

如果你想简化你可以使用字典(散列)并查看在字符串的位置0到字符串的结尾是否可以在字典中找到答案。如果你找到了一个你在字符串末尾的位置i开始一个新的char的总和。但是n的最小和最大的复杂性。