给出错误的输出:如何将字符串分解为字典单词
Giving wrong output: How to break a string into dictionary words
我正在尝试实现将给定字符串分解为其组成字典单词问题的解决方案,但我的代码为"冰淇淋冰淇淋"等字符串提供了错误的输出,其中我在输出中得到了两次单词。请让我知道我哪里出错了。以下是我的代码:
#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;
}
对于字符串冰淇淋冰淇淋:我希望这是输出的顺序:I 冰淇淋 I 冰淇淋冰淇淋冰淇淋首先,我以线性方式查找所有单词,然后回溯以获取剩余的单词。
这是一个解决方案(不完全是您想要的输出)(实时示例):
#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
也许像这样(使用 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
如何在内存中存储它们各自的值)。
更新:
更新以反映自定义排序功能。
引用:
根据长度对集合<字符串进行排序>字符串进行排序>