【问题标题】:Giving wrong output: How to break a string into dictionary words给出错误的输出:如何将字符串分解为字典单词
【发布时间】:2014-03-06 03:14:24
【问题描述】:

我正在尝试实现将给定字符串分解为其组成字典单词问题的解决方案,但我的代码为诸如“icecreamicecream”之类的字符串提供了错误的输出,其中我在输出中两次获得了一些单词。请让我知道我哪里出错了。以下是我的代码:

#include <set>
#include <algorithm>
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include<string.h>
#define MAX 12
using namespace std;
string arr[]={"i", "like", "sam", "sung", "samsung", "mobile", "ice","cream", "icecream", "man", "go", "mango"};
set<string> dictionary (arr,arr+MAX);
int cnt=0;
void print_words(string str,int i,int j)//i and j denote starting and ending indices respectively of the string to be matched
{
    if(i>j||j>=str.length()||i>=str.length())
        {
        return;
        }
    string temp (str, i, j-i+1);
    if(dictionary.find(temp)==dictionary.end())
        print_words(str,i,j+1);
    else
    {
        cout<<temp<<endl;
        cnt++;
        print_words(str,j+1,j+1);
        print_words(str,i,j+1);
    }

}
int main()
{
    string str;
    cin>>str;
    print_words(str,0,0);
    cout<<cnt<<endl;
    return 0;
}

对于字符串 icecreamicecream:我希望这是输出的顺序: 我冰淇淋我冰淇淋冰淇淋冰淇淋 第一次我以线性方式找到所有单词,然后回溯以获取剩余的单词。

【问题讨论】:

  • 您的问题有多种解决方案,但您似乎没有将它们分开(示例解决方案:ice cream ice creamicecream icecreami cream icecream...)。
  • 据我所知,显示的输出应该是:i ice cream i ice cream icecream icecream
  • 您应该在问题中发布您期望/想要的内容(比您的评论更详细)。
  • 我已经编辑了问题。
  • 好的,但是:这不是线性搜索(在“回溯”之前)。通过线性搜索,您将得到i cream(注意ice 不存在)。

标签: c++ string string-matching


【解决方案1】:

这是一个解决方案(不完全是您想要的输出)(live example)

#include <set>
#include <algorithm>
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include<string.h>

using namespace std;
string arr[]={"i", "like", "sam", "sung", "samsung", "mobile", "ice","cream", "icecream", "man", "go", "mango"};
set<string> dictionary (arr,arr+MAX);
int cnt=0;

void search_grow(string str, int i, int j)
{
    if(i > j || j >= str.length() || i >= str.length())
    {
        return;
    }

    string temp(str, i, j - i + 1);
    if(dictionary.find(temp) != dictionary.end())
    {
        std::cout << "[search_grow] " << temp << "\n";
        cnt++;
    }
    search_grow(str, i, j + 1);
}

void search_part(string str)
{
    for(int t = 0; t < str.size(); t++)
        search_grow(str, t, t);
}

int main()
{
    string str;
    cin>>str;
        search_part(str);
    cout<<cnt<<endl;
    return 0;
}

想法:进行线性搜索 (search_grow()),通过在字符串末尾扩展以在字典中搜索,然后开始重复字符串中的每个位置。

输出:

[search_grow] i
[search_grow] ice
[search_grow] icecream
[search_grow] cream
[search_grow] i
[search_grow] ice
[search_grow] icecream
[search_grow] cream
8

【讨论】:

  • @synxix 这很有帮助。
【解决方案2】:

可能是这样(使用 STL 和迭代器)?

#include <iostream>
#include <set>
#include <vector>
using namespace std;

//use a comparison function to define a custom ordering
//by which to order the strings based on length instead
//of by character:
struct CompareStrings {
    bool operator() (const string& s1, const string& s2) {
        return s1.size() < s2.size();
    }
};

int main() {
    const char *arr[] = {"i", "like", "sam", "sung", "samsung", "mobile", "ice","cream", "icecream", "man", "go", "mango"};
    size_t arr_size = sizeof(arr)/sizeof(arr[0]);

    //initialize the set with the array and with the custom ordering function:
    set <string, CompareStrings> dictionary (arr, arr+arr_size);
    vector <string> solutions;

    set <string>::iterator it;
    vector <string>::iterator jt;

    string test_string = "icecreamicecream";

    for (it = dictionary.begin(); it != dictionary.end(); ++it) {
        size_t found = test_string.find(*it);

        while (found != string::npos) {
            if (found != string::npos) {
                solutions.push_back(*it);
            }
            found = test_string.find(*it, found+1);
        }
    }

    //iterate over the solutions:
    for (jt = solutions.begin(); jt != solutions.end(); ++jt) {
        cout << *jt << endl;
    }

    return 0;
}

这个输出:

i
i
ice
ice
cream
cream
icecream
icecream

注意:输出以这种方式排序主要是因为值的存储取决于首先在集合中找到哪个元素(这本身取决于sets 如何将它们各自的值存储在内存中)。

更新:

更新以反映自定义排序功能。

参考:

Sorting a set<string> on the basis of length

【讨论】:

    猜你喜欢
    • 2014-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-21
    • 1970-01-01
    • 2017-02-26
    • 1970-01-01
    • 2017-10-09
    相关资源
    最近更新 更多