检查数组中是否包含单词

时间:2014-04-05 22:34:44

标签: c++

我想检查一个更大的字符串中包含的单词,但不一定是相同的顺序。示例:程序将检查单词" car"存在于" crqijfnsa"。在这种情况下,确实如此,因为第二个字符串包含c,a和r。

5 个答案:

答案 0 :(得分:1)

你可以建立一个包含字母" car"将值设置为0.使用所有字母在数组中循环,如果是单词" car"将值更改为1.如果地图中的所有键都具有大于0的值,则可以构造该单词。尝试实现这一点。

答案 1 :(得分:1)

anagram是一种文字游戏,是重新排列单词或短语的字母以产生新单词或短语的结果,使用所有原始字母只需一次;

所以,实际上你正在寻找的是一种算法来检查两个单词是否是" Anagrams"不是。

以下线程提供可能有用的伪代码 Finding anagrams for a given word

答案 2 :(得分:0)

一个非常原始的代码是这样的:

for ( std::string::iterator it=str.begin(); it!=str.end(); ++it)
    for ( std::string::iterator it2=str2.begin(); it2!=str2.end(); ++it2) {
        if (*it == *it2) {
            str2.erase(it);
            break;
        }
    }

if (str2.empty())
    found = true;

答案 3 :(得分:0)

您可以在您正在搜索的word中建立一个包含每个字母字符数的表格,然后在搜索str时逐步减少这些计数。

bool IsWordInString(const char* word, const char* str)
{
    // build up table of characters in word to match
    std::array<int, 256> cword = {0};
    for(;*word;++word) {
        cword[*word]++;
    }
    // work through str matching characters in word
    for(;*str; ++str) {
        if (cword[*str] > 0) {
            cword[*str]--;
        }
    }
    return std::accumulate(cword.begin(), cword.end(), 0) == 0;
}

一旦找到匹配项,也可以立即返回,但代码并不简单。

bool IsWordInString(const char* word, const char* str)
{
    // empty string
    if (*word == 0)
        return true;
    // build up table of characters in word to match
    int unmatched = 0;
    char cword[256] = {0};
    for(;*word;++word) {
        cword[*word]++;
        unmatched++;
    }
    // work through str matching characters in word
    for(;*str; ++str) {
        if (cword[*str] > 0) {
            cword[*str]--;
            unmatched--;
            if (unmatched == 0)
                return true;
        }
    }
    return false;
}

一些测试用例

"" in "crqijfnsa" => 1
"car" in "crqijfnsa" => 1
"ccar" in "crqijfnsa" => 0
"ccar" in "crqijfnsac" => 1

答案 4 :(得分:0)

我认为使用std::includes执行最简单(也可能是最快的,自己测试:)):

std::string testword {"car"};
std::string testarray {"crqijfnsa"};

std::sort(testword.begin(),testword.end());
std::sort(testarray.begin(),testarray.end());

bool is_in_array = std::includes(testarray.begin(),testarray.end(),
    testword.begin(),testword.end());

这也正确处理所有重复字母的情况。 此方法的复杂性应为O(n * log n),其中ntestarray的长度。 (sortO(n log n)includes具有线性复杂性。