单词替换(C++)

题目

单词替换

在英语中,我们有一个叫做 词根(root)的概念,它可以跟着其他一些词组成另一个较长的单词——我们称这个词为 继承词(successor)。例如,词根an,跟随着单词 other(其他),可以形成新的单词 another(另一个)。

现在,给定一个由许多词根组成的词典和一个句子。你需要将句子中的所有继承词用词根替换掉。如果继承词有许多可以形成它的词根,则用最短的词根替换它。

你需要输出替换之后的句子。


样例

输入:dictionary = [“cat”,“bat”,“rat”], sentence = “the cattle was rattled by the battery”
输出:“the cat was rat by the bat”


解决方法

语言:C++
结构:前缀树


代码

//前缀树
class Tire {
private:
	Tire* next[26] = { nullptr };
	bool is_ok = false;
public:
	Tire() {};
	//建立前缀树,插入
	void insert(string dic)
	{
		auto root = this;
		for (auto x : dic)
		{
			if (root->next[x - 'a'] == nullptr)
				root->next[x - 'a'] = new Tire();
			root = root->next[x - 'a'];
		}
		root->is_ok = true;
	}
	//寻找是否存于前缀树中
	string isstring(string sentence)
	{
		auto root = this;
		string ok;
		for (auto x : sentence)
		{
			if (root->is_ok == true)
				return ok;
			if (root->next[x - 'a'] == nullptr)
				return sentence;
			ok += x;
			root = root->next[x - 'a'];
		}
		return sentence;
	}
};


class Solution {
public:
//解决方法函数
	string replaceWords(vector<string>& dictionary, string sentence) {
		auto i = dictionary.size();
		auto w = sentence.size();
		Tire tire;
		for (int j = 0; j != i; ++j)
		{
		//建立字典前缀树
			tire.insert(dictionary[j]);
		}
			string temp = "";
			string out = "";
			//采用输入流,使句子分割为单词
			stringstream strstream(sentence);
			while (strstream >> temp)
				out+=tire.isstring(temp)+" ";
			//最后一个单词后没有空格
			out.pop_back();
			cout << out << endl;
			return out;
	}
};

运行结果

运行结果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值