变位词快速分离

变位词是形如以下的单词 eat tea 和 silent listen 互为变位词,那么对于一个单词的集合怎样快速的把变位词分离出来呢

首先把 单词的每个字符进行排序,这样所有的变位词就有了相同的序列,然后在对这些进行序列进行一次排序。

这样就把这些变位词分离出来了。


时间复杂度 nlogn

        #include<iostream>
        #include<vector>
        #include<algorithm>
        using namespace std;
        
        typedef struct node
        {
		    string sstr;
        	string ssort;
		}node;
		
		int comp(node a,node b)
		{
			return a.ssort<b.ssort;
		}
        
        int main()
{
	     int n;
	     while(cin>>n)
	     {
	     	vector<node> coll;
	     	for(int i=1;i<=n;i++)
	     	{
	     		string temp1,temp2;
	     		cin>>temp1;
	     		temp2=temp1;
	     		sort(temp2.begin(),temp2.end());
	     		coll.push_back(node{temp1,temp2});
			}
			
			sort(coll.begin(),coll.end(),comp);
		    
		    string sym=coll[0].ssort;
		    for(int i=0;i<coll.size();i++)
		    {
		    	if(coll[i].ssort==sym)
		    	cout<<coll[i].sstr<<" ";
		    	if(i+1<coll.size()&&coll[i+1].ssort!=sym)
		    	{
		    		sym=coll[i+1].ssort;
		    		cout<<endl;
				}
			}
			cout<<endl;
		 }
}



        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值