Anagrams
Given an array of strings, return all groups of strings that are anagrams.
Note: All inputs will be in lower-case.
/** 整理的提交代码
* 处理复杂度为O(n),n是字符串个数,但是其中有排序等步骤没有固定考虑
* 主要思路:
* 1、先对特殊情况进行处理
* 2、为了输出原始字符串,记录原始字符串和经过排序的字符串,并将这个对组(pair)存入一个vector中,
* 也可以将其存入一个map中,我是为了后面对字符串对组排序后再进行查找时的效率,vector是顺序存储的。
* 但无论是用vector还是map都会另外申请一块二倍于原来字符串数组大小的空间,比较浪费空间。
* 3、接下来排序这个对组vector,排序准则是对组的第二个元素(字符串)小与关系,这个排序过程比较耗费时间。
* 4、使用两个索引变量,每次固定第一个然后移动第二个,如果不是Anagrams关系,则判断两个索引之间的距离,
* 如果大于两个则取出对应对组的第一个元素(原始字符串)。如果到了末尾且相等则也要判断两个索引距离。
* 总之这个过程是O(n)复杂度,它只遍历一遍之前创建的对组vector,没有重复或者说回溯。
* 提交结果:
* (Judge Small)
* Run Status: Accepted!
* Program Runtime: 4 milli secs (基本在几毫秒)
* Progress: 12/12 test cases passed.
* (Judge Large)
* Run Status: Accepted!
* Program Runtime: 208 milli secs (基本稳定在二百零几毫秒左右)
* Progress: 95/95 test cases passed.
*/
#include <string>
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
class Solution {
private:
static bool pairSortCriterion(const pair<string, string>& p1, const pair<string, string>& p2)
{
return p1.second < p2.second;
}
public:
vector<string> anagrams(vector<string> &strs) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
size_t size = strs.size();
vector<string> result;
// 特殊情况处理
if (size < 2)
{
return result;
}
pair<string, string> word_pair; // <原始字符串,排序后字符串>
vector<pair<string, string> > pairs;
// 所有字符串排序
for (size_t i = 0; i != size; i++)
{
word_pair.first = strs[i];
sort(strs[i].begin(), strs[i].end());
word_pair.second = strs[i];
pairs.push_back(word_pair);
}
// 字符串pair数组排序
sort(pairs.begin(), pairs.end(), pairSortCriterion); // string本省支持<。
size_t i = 0, j = 0;
size_t k = i;
int count = 1;
while (j < size-1)
{
j++;
if (pairs[i].second == pairs[j].second && j == size-1)
{
for (k = i; k <= j; k++)
{
result.push_back(pairs[k].first);
}
}
// 判断i-j范围内的字符串
if (pairs[i].second == pairs[j].second)
{
count++;
}
else
{
if (count > 1)
{
// 保存i-j范围内的字符串
for (k = i; k < j; k++)
{
result.push_back(pairs[k].first);
}
}
i = j; // 跳到下一个考察元素,即当前位置j处的字符串,之前的i-j范围内的是符合要求的字符串
count = 1;
}
}
return result;
}
};
int main()
{
vector<string> strs;
string str;
cout << "input strs: " << endl;
while (cin >> str)
{
strs.push_back(str);
}
Solution s;
vector<string> result = s.anagrams(strs);
cout << "result: " << endl;
for (size_t i = 0; i != result.size(); i++)
{
cout << result[i] << endl;
}
return 0;
}
自定义的排序准则作为全局函数或者类静态成员函数也需要放入测试系统。不可以将其放入类中作为一个普通成员函数,因为有this参数。