一尘不染

C ++用词查找字谜

algorithm

我正在研究一个程序,该程序使用来查看特定单词是否是一个字谜,std:count但我认为我的函数逻辑不正确,而且似乎无法弄清楚。

假设文件中包含以下单词:

Evil
Vile
Veil  
Live

我的代码如下:

#include <iostream>
#include <vector>
#include <fstream>
#include <map>
using namespace std;

struct Compare {
std::string str;
Compare(const std::string& str) : str(str) {}
};

bool operator==(const std::pair<int, std::string>&p, const Compare& c) {
return c.str == p.second;
}
   bool operator==(const Compare& c, const std::pair<int, std::string>&p) {
   return c.str == p.second;
}

std::vector<std::string> readInput(ifstream& file)
{
std::vector<std::string> temp;

string word;

while (file >> word)
{
    temp.push_back(word);
}
std::sort(temp.begin(), temp.end());

return temp;
}

int main(int argc, char *argv[]) {

string file = "testing.txt";
ifstream ss(file.c_str());

if(!ss.is_open())
{
    cerr << "Cannot open the text file";
}

std::vector<std::string> words = readInput(ss);

std::map<int, std::string> wordsMap;

//std::map<std::string value, int key> values;

for(unsigned i=0; (i < words.size()); i++)
{
    wordsMap[i] = words[i];
}


int count = std::count(wordsMap.begin(), wordsMap.end(), Compare("Evil"));
cout << count << endl;
}

我很确定这只是我的逻辑在函数中出错的一种情况。我希望有人能帮帮忙 :)


阅读 227

收藏
2020-07-28

共1个答案

一尘不染

最简单的方法是

进行如下检查(伪代码)

bool isAnagram(string s, string t) {return sort(s) == sort(t); }

因此,请使用以下想法,无需 std::map

struct Compare {
std::string str;
Compare(const std::string& x) : str(x) { 
    std::sort(str.begin(),str.end()); std::transform(str.begin(), 
    str.end(),str.begin(), ::toupper);}

    bool operator ()(const std::string& t)
    {
        std::string s= t;
        std::transform(s.begin(), s.end(),s.begin(), ::toupper);
        std::sort(s.begin(),s.end());

    return s == str;
    }
};

然后

int count = std::count_if(words.begin(), words.end(), Compare("Evil"));

这里

2020-07-28