一 题目描述
给出一个string的数组str及其大小int n,对其进行排序,将所有变位词合并,保留其字典序最小的一个串。变位词指的是变换其字母顺序所构成的新的词或短语,并返回排序合并后的数组。要求字符串长度不大于20,数组大小小于等于300。
测试样例: ["ab","ba","abc","cba"]
返回:["ab","abc"]
二 题解
先将字符串数组进行排序,然后变量每个字符串:先排序,然后加入到集合中(集合中不存在该元素的前提下),同时将未排序的字符串加入到返回数组中。这样集合中有几个字符串(排序了的字符串),返回的数组中就有几个对应的字符串(未排序的字符串)
class SortString {
public:
vector<string> sortStrings(vector<string> str, int n) {
set<string> str_set;
vector<string> res;
//对字符串数组排序
sort(str.begin(),str.end());
vector<string> str_sorted = str;
for(int i=0; i<n; i++){
//对每个数组元素——字符串排序
sort(str[i].begin(),str[i].end());
//检测集合中是否存在该排序字符串,如果不存在将该排序字符串加入集合中
if(str_set.find(str[i]) == str_set.end()){
str_set.insert(str[i]);
//将排序前对应的字符串也加入返回数组
res.push_back(str_sorted[i]);
}
}
return res;
}
};
完整代码
#include<iostream>
#include<string>
#include<vector>
#include<set>
#include<algorithm>
using namespace std;
class SortString {
public:
vector<string> sortStrings(vector<string> str, int n) {
// write code here
// 利用set结构的特性
// 对于相同元素的插入,set不往里面添加
// 这样ab 和排好序的ba就可以统一为ab了
set<string> str_set;
set<string> str_set_temp;
sort(str.begin(), str.end());// 将str排好序
//for (int i = 0; i < n; i++)
// cout << str[i] << " ";
vector<string> temp = str; //temp=["ab","abc","ba","cba"]
for (int i = 0; i < n; i++)
{
// 对其str内部的字符串进行排序
sort(str[i].begin(), str[i].end());
//cout << str[i] << endl;
//判断str_set中是否存在str[i],
if (str_set.find(str[i]) == str_set.end()) // 不存在
{
str_set.insert(str[i]);
str_set_temp.insert(temp[i]);
}
}
vector<string> res;
set<string>::iterator it;
for (it = str_set_temp.begin(); it != str_set_temp.end(); it++)
res.push_back(*it);
return res;
}
};
int main()
{
vector<string> test_str = {"ab","ba","abc","cba"};
SortString obj;
obj.sortStrings(test_str, 4);
return 0;
}