将字符串的排列与存储在文本文件中的单词进行比较

时间:2012-10-31 07:04:48

标签: c++ stl

我打算找出用户输入的字符串的任何排列是否是具有很少单词的文本文件中的有效单词。

输入字符串后,没有任何反应! “if”stmt还是什么错了?请尽快提供帮助!另外,如果我想执行的其他操作意味着控制权永远不会达到,即使我输入list.txt中存在的单词

请建议解决方案或阅读。感谢您的期待。

//检查用户输入的单词的任何排列是否在预定义的文本文件中

//check if any permutation of a user inputted word are in a pre defined text file

    #include <iostream>
    #include <fstream>
    #include <vector>

    using namespace std;

    int main(){
        cout<<"Enter a word to check for the presence of any
        << of its permutation in a file \n"; 
        string word; 
        cin>>word; 
        sort(word.begin(), word.end()); 
        vector<string> str; 
        do str.push_back(word);
        while( next_permutation(word.begin(),word.end()) );                  

        ifstream readFile("list.txt");
        string line;
        while(readFile>>line){
              for (int i = 0; i < str.size(); ++i){
                  if(line==str[i]){
                     cout << "found " << str[i] << endl;
                     break;
                  }
              }
        }
        system("pause");
        return EXIT_SUCCESS;
    }

3 个答案:

答案 0 :(得分:1)

除非你的字典非常庞大(如此之大,你无法将它全部保存在内存中),我会从字典中读出一个单词,创建副本并对副本中的字母进行排序,然后将它们添加到矢量中成对的排序/原始单词。当你全部阅读它们时,按照排序的单词按顺序对矢量进行排序。

如果要检查字典是否包含(置换)单词,请对该单词进行排序,然后在向量上使用std::equal_range查找与其匹配的所有单词。

答案 1 :(得分:1)

您无需进行任何排列。

您只需对字典中每个单词的字符进行排序,并与用户输入字符串中的排序字符进行比较。它们可能匹配多个单词。您可以成对存储字典。我会这样做一次并存储它供以后使用。例如:

addpy paddy
orst sort
cet etc

如果您按照第一个(已排序)单词对字典对进行排序,则可以使用二进制搜索快速查找已排序的用户字符串,然后在两个方向上查找其他匹配单词。

答案 2 :(得分:0)

1)您应该存储字符串以在向量中搜索。

vector<string> words_to_search;
sort(word.begin(), word.end()); 
do 
   words_to_search.push_back(word);
while (next_permutation(word.begin(), word.end()));

然后你可以像这样循环遍历

for (vector<string>::iterator i = words_to_search.begin();
     i != words_to_search.end(); ++i)
{
    string search_word = *i;
    // search for search_word
    ...
}

2)要比较你的字符串,只需使用==

if (line == search)

您可能需要首先从line删除前导和尾随空格。