字母重排 stl
来源:互联网 发布:apache评分与死亡率 编辑:程序博客网 时间:2024/06/06 03:21
我们假设字典大小为n,需要查询的单词数位m
如果直接拿每次遇到的单词与字典中的每个单词进行比较,时间复杂度O(mn)
如果我们先将字典排好序,并且每个单词也是排好序的,那么每次查询耗时O(logn),总的时间复杂度为O(nlogn+mlogn),在实际的应用中,我们可以先把字典排好序,以后每次查询的时间就是O(logn),如果不排序,每次查询要O(n),在字典较大和查询次数较多时,第二钟方法较好。
由于都是字符串,我们可以用STL提供的容器解决问题。
用string保存单词,用multimap保存字典中每个单词排序前和排序后的映射。主要,这里用了multimap,而不是map,由于字典中可能有几个单词排好序后是同一个单词,这就存在单对多的映射,map只是单对单的映射。
这里还有一个需要注意的地方就是,用multimap存单词映射时,如果关键字相同的话,那么这些值按插入的顺序存储,所以在输出结果的时候,要用一个set保存结果,然后再输出,这其实就是又进行了一次排序。
代码如下
#include <iostream>#include <string>#include <vector>#include <map>#include <algorithm>#include <set>using namespace std;multimap<string, string> ssmap;multimap<string, string>::iterator ssiter;void solve(vector<string> &strvec){if (strvec.empty())return;size_t size = strvec.size();for (int i = 0; i < size; i++){string sortstr = strvec[i];sort(sortstr.begin(), sortstr.end());ssmap.insert(make_pair(sortstr, strvec[i]));}}int main(void){vector<string> strvector;string str;while (cin >> str){if (str == "******")break;strvector.push_back(str);}solve(strvector);while (cin >> str){string sortstr = str;sort(sortstr.begin(), sortstr.end());ssiter = ssmap.find(sortstr);if (ssiter == ssmap.end())cout << ":(" << endl;else{set<string> sset;for (; ssiter != ssmap.end() && (*ssiter).first == sortstr; ++ssiter)sset.insert((*ssiter).second);set<string>::const_iterator ssetciter;for (ssetciter = sset.begin(); ssetciter != sset.end(); ++ ssetciter)cout << *ssetciter << " ";cout << endl;}}return 0;}
- 字母重排 stl
- 字母重排
- 字母重排
- 字母重排
- 字母重排
- 字母重排
- 字母重排
- 字母重排
- 字母重排
- 字母重排
- 字母重排
- 字母重排
- 字母重排
- 字母重排
- 字母重排
- 字母重排
- 字母重排
- //字母重排
- Android复制Assets目录下的文件到指定目录
- 如何保存成员变量animationManager?
- /etc/init.d/rcS内容分析
- springMVC教程
- 序
- 字母重排 stl
- HDU 2084(数塔)
- 字符设备 register_chrdev_region()、alloc_chrdev_region() 和 register_chrdev()函数的区别
- Hibernate中缓存机制
- 【转】精明的程序员——小程大爱
- httpclient 状态码
- 二叉树
- 四舍六入五成双
- 动静始然