题目:给出一组字符串
输入:"ate","eat","Eat","new","ENW",“wha”
输出::"ate","eat","Eat","
"new","ENW"
第一种方法,首先将所有字符串都转换为小写(或者大写也OK,重点在于统一字符串),
然后将单个字符串中的字母按照大小顺序进行排列;
最后比较字符串大小,如果有相同的字符串就输出。
这种方法复杂度其实也挺大的,因为有三层循环。
第二种方法,第一步同第一种方法
然后利用字符串中自带find函数进行查找,
用一个vector存储相同的字符串的位置
好吧,这种方法其实复杂度太大了,因为find 函数本来就是一重循环,共有四层循环
第三种方法,好吧,我承认是昨天看了hash表的原因,我想采用hash表来实现
首先计算每个字符串的hash值,方法如下,当然也可以改变方式
string s; int value;
for(string::iterator it=s.begin(),it!=s.end();it++)
{
if(isupper(*it))
value+=(*it-'A');
else
value+=(*it-'a');
}
将字符串插入到hash表中的方法是,由于每一行是我们需要的“相同”的字符串,所以首先是判断hash值是否相同,如果相同了之后再比较这两个字符串是否“相同”
如果字符串也“相同”,采用头插法插入字符串;如果不相同的话则采用线性探测法去寻找储存该字符串的位置,(现在看来貌似这点我有点没有做好,改一改)
最后也实现了相同的功能。这种方法主要是想通过hash值的设置来减少字符串的比较次数,从而降低复杂度。
尝试了一下,采用10000组数据,发现第二种方法永远是最劣质的,好吧,这种方法我也觉得,看几个的时候还是OK的,数据一多的时候,立马暴露缺陷了。
但是奇怪的事情出现了,第三种方式在debug模式下足足比第一种方式快了10倍,但是一到release模式下竟然比第一种方式还慢了一半,实在是百思不得其解啊,看来还是要好好看看debug和release的区别了!!!