对字符串数组进行排序,将所有变位词排在相邻的位置。


    题目:对字符串数组进行排序,将所有变位词排在相邻的位置。变位词就是组成的字母相同,但顺序不一样的单词。 比如说: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;
			}
		}
	}
	
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值