免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123
最近访问板块 发新帖
楼主: kk861123
打印 上一主题 下一主题

一个字符串匹配的题目 [复制链接]

论坛徽章:
0
21 [报告]
发表于 2013-04-03 17:14 |只看该作者
回复 19# kk861123


    对于楼主的例子的确是可以的,不过如果字符串再长一些,比如500个,这个性能可能就不能接受了,虽然方法变了,本质(遍历字符串)没变。
   这个问题还要看具体的场景。

论坛徽章:
0
22 [报告]
发表于 2013-04-03 22:51 |只看该作者
回复 21# sammyjeep


    您说的很有道理,要看环境

论坛徽章:
0
23 [报告]
发表于 2013-04-04 00:18 |只看该作者
本帖最后由 afukada 于 2013-04-04 00:30 编辑

不知道思路上有沒有錯

還請大家指教一下

踩在前面一些方法之下

想法:

遍歷其中一個字串

另一個字串用最少的計算次數

先驗證str1字串長度等於str2字串長度

然後對每一個str1的字元做hash(%count)

然後用的s///g對於每個hash(%count)的$key來作取代並計算取代的次數

計算取代的次數是不是等於$count{$key}的value

如果hash(%count)的value等於1的時候

表示str1已經等於str2(因為剩下的字元的出現一次)

則表示str1 eq str2

如果在作取代的過程中發現有取代的次數不等於$count{$key}的value

則表示str1 ne str2

code如下:
  1. $str1="abcda";
  2. $str2="adabc";
  3. $check=0;

  4. if(length($str1)==length($str2))
  5. {
  6.         my @str1_s=split(//,$str1);
  7.        
  8.         for(@str1_s)
  9.         {
  10.                 $count{$_}++;
  11.                 $check++ if($count{$_}>=2);
  12.         }
  13.        
  14.         if($check==0)
  15.         {
  16.                 print $str1,"=",$str2,"\n";
  17.         }
  18.         else
  19.         {
  20.                 $check=0;
  21.                
  22.                 foreach(sort{$count{$a}<=>$count{$b}}keys($count))
  23.                 {
  24.                         if($count{$_}>1)
  25.                         {
  26.                                 print $str1,"!=",$str2,"\n" if($count{$_}!=($str2=~s/$_//g));
  27.                         }
  28.                         else
  29.                         {
  30.                                 print $str1,"=",$str2,"\n" if($check==0);
  31.                                 last;
  32.                         }
  33.                 }
  34.         }
  35. }

  36. print $str1,"==",$str2,"\n" if($check==0);
复制代码
如果code有問題請告訴我

這個方法我目前想到的問題

1.字串太短等於做了很多多餘的事

2.應該要設一個字串長度以上在做這個驗證

3.排序我是依據所需要的element來做設計,我的想法是越少的element越快

不知道大家有什麼意見

還請大家指教

獻醜了<(_._)>

论坛徽章:
0
24 [报告]
发表于 2013-04-07 15:47 |只看该作者
回复 22# kk861123


    主要还是看算法的时间复杂度,遍历字符串本身就是O(n),理论上split //, xxx 也应该是O(n),当然由于 split本身是perl内部已经实现了,可能比代码中的遍历更快一点。如果人用一个算法时间复杂度小于O(n),应该可以提高不少速度吧,抛砖引玉,呵呵。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP