题目:对字符串数组进行排序,将所有变位词排在相邻的位置。变位词就是组成的字母相同,但顺序不一样的单词。 比如说:live和evil就是一对变位词。
提示:题目不要求我们将字符串数组中的字符串按字典序排序,否则我们直接调用STL中的sort 函数就可以了。它要求我们在排序的过程中,按照变位词的准则来排序。 这种情况下,可以调用sort函数,但要自己写一个对比函数。变位词最重要的特点是字符经过字典序排序后就是一样的。
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
bool compare(string s1, string s2){
<span style="white-space:pre"> </span>transform(s1.begin(),s1.end(),s1.begin(),tolower);
transform(s2.begin(),s2.end(),s2.begin(),tolower);
sort(&s1[0], &s1[0]+s1.length());
sort(&s2[0], &s2[0]+s2.length());
return s1 < s2;
}
void AnagramSort(vector<string> &s)
{
<span style="white-space:pre"> </span>if(s.empty() )
<span style="white-space:pre"> </span>return;
<span style="white-space:pre"> </span>sort(s.begin(),s.end(),compare);
}
不使用STL自带的函数sort,也可以实现:
//对比函数,a<b 返回-1 , a>b 返回1 , a==b 返回0
int Compare(string a,string b)
{
int res;
int ia=0,ib=0,lena=a.size(),lenb=b.size();
while(ia<lena && ib<lenb && a[ia]==b[ib])
{
ia++;
ib++;
}
if(ia<lena && ib<lenb)
{
if(a[ia]<b[ib])
return -1;
if(a[ia]>b[ib])
return 1;
}
if(ia<lena)
return 1;
if(ib<lenb)
return -1;
return 0;
}
//输入一个字符串,返回其按照元素字典排序组成的字符串,大小写不敏感
string AnagramToStr(string str)
{
//先把大写字母转成小写
int len=str.size();
for(int i=0;i<len;i++)
if(str[i]>='A' && str[i]<='Z')
str[i]+=32;
for(int i=0;i<=len-2;i++)
{
for(int j=0;j<=len-2-i;j++)
{
if(str[j]>str[j+1])
{
char tmp=str[j];
str[j]=str[j+1];
str[j+1]=tmp;
}
}
}
return str;
}
//排序函数
void myAnagramSort(vector<string> &s)
{
if(s.empty())
return;
int len=s.size();
for(int i=0;i<=len-2;i++)
{
for(int j=0;j<=len-2-i;j++)
{
if(Compare(AnagramToStr(s[j]),AnagramToStr(s[j+1]))>0)
{
string tmp=s[j];
s[j]=s[j+1];
s[j+1]=tmp;
}
}
}
}