**抛出问题**
这是一个算法题目,详细要求如下:
Description
输入N和一个要查找的字符串,以下有N个字符串,我们需要找出其中的所有待查找字符串的变位词(例如eat,eta,aet就是变位词)按字典序列输出,并且输出总数目
Input第一行:N(代表共有N个字符串属于被查找字符串) (N<=50) 第二行:待查找的字符串(不大于10个字符) 以下N行:被查找字符串(不大于10个字符)
Output按字典序列输出在被查找字符串中待查找字符串的所有变位词 每行输出一个 输出完成后输出总数目
Sample Input
7 asdfg asdgf asdfg dsafg xcvcv gfdsa tyuv asd
Sample Output
asdfg asdgf dsafg gfdsa 4
解题思路:
1、判断是否为变位词
2、将变位词按字典顺序输出
解题步骤:
1、定义string
2、判断两个string是否为变位词
3、将是变位词的string放入vector<string>中
4、vector进行sort排序
5、统计vector中的size
6、输出
编码:
1、判断两个string是否为变位词
(1)将两个string进行sort排序
(2)判断排序后的string是否相同:如果相同,则两个string为变位词;反之,则不同
int isbianweici(string s,string s1)
{
sort(s.begin(),s.end());
sort(s1.begin(),s1.end());
if(s == s1)
return 1;
else
return 0;
}
2、将vector<string>sort排序,输出
sort(sreslut.begin(),sreslut.end());
for(it=sreslut.begin();it != sreslut.end();it ++)
cout<<*it<<endl;
cout<<sreslut.size()<<endl;
完整代码:
#include<string>
#include<vector>
#include<string>
#include<iostream>
#include<algorithm>
using namespace std;
int isbianweici(string s,string s1)
{
sort(s.begin(),s.end());
sort(s1.begin(),s1.end());
if(s == s1)
return 1;
else
return 0;
}
int main()
{
int n;
cin>>n;
string firsts;
cin>>firsts;
vector<string> sreslut;
vector<string>::iterator it;
for(int i=0;i<n;i++)
{
string ss;
cin>>ss;
if(isbianweici(firsts,ss))
sreslut.push_back(ss);
}
sort(sreslut.begin(),sreslut.end());
for(it=sreslut.begin();it != sreslut.end();it ++)
cout<<*it<<endl;
cout<<sreslut.size()<<endl;
}
总结:
1、短短只有35行代码;
2、在查找变位词的策略上,如果采用先将string的所有变位词找出放入vector<string>中,然后在进行对比的方式,在算法运行中,如果string的长度为n,则需要进行n!次排序以查找string所有的变位词,这种方式在算法复杂度上显示是不能接受的;
3、在STL中,string类型的sort排序,会将string中的每一个char按照字典顺序进行排序,如果两个string经过sort排序之后,是相同的,那这两个string必然是变位词(两个string不同);
4、在STL中,vector<string>的sort排序,同样会将vector<string>中的元素按照字典顺序进行排序。
5、问题在35行代码之后,迎刃而解。
后话:
第一次写博客,最近初学STL,代码编写没有完全按照编程规范,有待学习。希望各位指点交流。