变位词程序

如果两个单词,他们的字母组成一样而字母位置有区别,那么就称这两个单词为变位词。如 pans 和 span , tops 和 stop。

所有的变位词,对他们按字母顺序排序,得到相同的字符串(这个字符串成为该单词的签名)。把这个字符串作为这堆单词的排序标准,排序完之后,相同签名的单词肯定是相邻位置,如果当前单词的签名和上一个单词的签名相同,则他们是变位词,在同一行输出,否则不是,另外一行输出。

sign.exe 读入每个单词,为每个单词生成签名

#include <string>
#include <iostream>
#include <algorithm>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	string sig;
	string word;
	while(cin>>word)
	{
		sig = word;
		sort(sig.begin() , sig.end());
		cout<<sig<<" "<<word<<endl;
	}
	return 0;
}

然后用sort对每一行排序,对于签名相同的单词,在同一行输出

squash.exe 读入签名和该单词,如果签名和之前相同,则直接输出,否则换行

#include <iostream>
#include <string>

using namespace std;

#define STRLEN 30

int main()
{
	string sig,word;
	string oldSig("");

	bool bIsFirst = true;

	while(cin>>sig && cin>>word)
	{
		if (sig != oldSig && !bIsFirst)
		{
			cout<<endl;
		}
		oldSig = sig;
		cout<<word<<" ";
		bIsFirst = false;
	}

	return 0;
}

写1.txt

pans
pots
opt
snap
stop
tops

sign < 1.txt | sort  | squash > 2.txt 

得到结果

2.txt

pans snap 
pots stop tops 
opt 




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值