程序员面试金典: 9.11 排序与查找 11.1编写一个方法,对字符串数组进行排序,将所有变位词排在相邻的位置。
来源:互联网 发布:形容男人帅的网络词 编辑:程序博客网 时间:2024/05/18 03:18
#include <iostream>#include <stdio.h>#include <vector>#include <algorithm>#include <string>#include <map>using namespace std;/*问题:编写一个方法,对字符串数组进行排序,将所有变位词排在相邻的位置。分析:首先变位词表示两个词可以通过变化变成另一个词,一个办法就是统计所有字符出现次数,若两个字符串对应 字符出现次数都相等,表示是变位词。 解法:先对字符串数组按照普通排序(sort),然后遍历字符串数组,对每个字符串排序,如果该字符串出现在<字符串,字符串数组>映射中 就加入当前字符串时间复杂度:排序O(N*LogN) + 遍历每个字符串再排序O(N*N*LogN),应该是O(N^2*logN)输入:5(字符串元素个数)abc abd bac cad cab输出:abc bac cab abd cad关键:书上解法:1、由于变位词之间没有顺序,因此可以修改通用排序算法中字符串比较规则,先将两个字符串各自排序,然后再比较2、或者直接遍历字符串数组,对每个字符串排序,如果该字符串出现在<字符串,字符串数组>映射中 就加入当前字符串*///这个函数里面发生中断了,有bugbool compare(string str1 , string str2){/*if(str1.empty() && str2.empty()){return true;}else if(str1.empty()){return true;}else if(str2.empty()){return false;}*/string tempStr1 = str1;string tempStr2 = str2;sort(tempStr1.begin() , tempStr1.end());sort(tempStr2.end() , tempStr2.end());//然后比较两个字符串,这里strcmp返回正数: str1 > str2 ,str1<str2返回负数int result = strcmp(tempStr1.c_str() , tempStr2.c_str() );bool flag = result < 0 ? true : false;return flag;}vector<string> stringSort(vector<string>& inputStrings){sort(inputStrings.begin() , inputStrings.end() , compare);return inputStrings;}void print(vector<string>& strings){int size = strings.size();for(int i = 0 ; i < size ; i++){cout << strings.at(i) << " ";}cout << endl;}//变位词排序2:map<string , vector<string> > stringSort2(vector<string>& inputStrings) { //先正常排序,不需要正常排序,题目没有说明变位词之间还有顺序 //sort(inputStrings.begin() , inputStrings.end()); map<string , vector<string> > strToList; int size = inputStrings.size(); string str; string sortStr; for(int i = 0 ; i < size ; i++) { sortStr = str = inputStrings.at(i); sort(sortStr.begin() , sortStr.end()); map<string , vector<string> >::iterator it = strToList.find(sortStr); //如果该变位词字符串出现过 if(it != strToList.end() ) { it->second.push_back(str); } else { vector<string> strings; strings.push_back(str); strToList.insert(pair<string , vector<string> >(sortStr , strings)); } } return strToList; }void print(map<string , vector<string> >& strToList){vector<string> strings;int size;for(map<string , vector<string> >::iterator it = strToList.begin() ; it != strToList.end() ; it++){strings = it->second;size = strings.size();for(int i = 0 ; i < size ; i++){cout << strings.at(i) << " ";}}cout << endl;}void process(){int n;vector<string> strings;string value;map<string , vector<string> > strToList;while(cin >> n){strings.clear();strToList.clear();for(int i = 0 ; i < n ; i++){cin >> value;strings.push_back(value);}strToList = stringSort2(strings);print(strToList);/*strings = stringSort(strings);print(strings);*/}}int main(int argc, char* argv[]){process();getchar();return 0;}
0 0
- 程序员面试金典: 9.11 排序与查找 11.1编写一个方法,对字符串数组进行排序,将所有变位词排在相邻的位置。
- 编写一个方法,对字符串进行排序,将所有变位词排在相邻的位置
- 【Java】编写一个方法,对字符串数组进行排序,将所有变位词排在相邻的位置
- 9.11排序与查找(二)——对字符串数组进行排序,将所有的变位词排在相邻的位置
- 对字符串数组进行排序,将所有变位词排在相邻的位置。
- 对字符串数组进行排序,将变位词排在相邻位置
- 程序员面试金典: 9.11 排序与查找 11.5有个排序后的字符串数组,其中散布这一些空字符串,编写一个方法,找出给定字符串的位置
- 程序员面试金典: 9.11 排序与查找 11.1给定两个排序后的数组A和B,其中A的末端有足够的缓冲容纳B。编写一个方法,将B合入A并排序。
- 变位词排在相邻的位置
- 程序员面试金典(排序与查找):变位词排序(java解法)
- 程序员面试金典——变位词排序__
- Sorting&Searching 基于变位词的字符串数组排序 @CareerCup
- 首先 随机创建一个数组 然后对数组进行排序 后在进行二分查找
- 对字符串数组进行排序,在冒泡法排序中使用compareTo()方法确定排序的顺序。
- 程序员面试金典: 9.11 排序与查找 11.3找出已排序数组经过旋转后某个元素
- C++利用指针数组和快排对输入的字符串进行排序
- 9.11排序与查找(四)——20GB的文件,每一行一个字符串,说明如何将这个文件进行排序
- 程序员面试金典: 9.11 排序与查找 11.8求某元素在二叉查找树中的排名
- 求数字在数组中出现的次数
- Substring with Concatenation of All Words
- 表单form action的url写法
- 72问72答 — 小程序集合(非研发级问答)
- Qemu运行linux 4.9
- 程序员面试金典: 9.11 排序与查找 11.1编写一个方法,对字符串数组进行排序,将所有变位词排在相邻的位置。
- 小程序模仿QQ6.0侧滑菜单
- 最小二乘
- 飞机大战
- 【已解决】web项目中新加的jar包和tomcat自带的jar冲突问题
- rtmp 协议中对视频格式的封装
- vue基础语法学习
- WebDriver Login 登录测试用例
- 微信小程序商城开发