我想检查一个更大的字符串中包含的单词,但不一定是相同的顺序。示例:程序将检查单词" car"存在于" crqijfnsa"。在这种情况下,确实如此,因为第二个字符串包含c,a和r。
答案 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)
,其中n
是testarray
的长度。 (sort
为O(n log n)
,includes
具有线性复杂性。