免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: kk861123

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

论坛徽章:
0
发表于 2013-03-11 16:33 |显示全部楼层
#!/usr/bin/perl
use strict;
use warnings;
use Data:umper;

my $str1='abcda';
my $str2='adabcc';
my (%m,%n);

$m{$_}++ for split //,$str1;
$n{$_}++ for split //,$str2;
my  $label=0;
my  $label_x=0;
foreach (keys %m){
if(defined($n{$_}) && ($n{$_}== $m{$_})){$label++;}
else
        { $label=0;last;}
}

foreach (keys %n){
if(defined($m{$_}) && ($m{$_}== $n{$_})){$label_x++;}
else
        { $label_x=0;last;}
}
if( $label !=0 && $label_x != 0)
        { print "Yes\n";}
else {
        print "no\n";
        }

论坛徽章:
6
卯兔
日期:2013-11-26 14:52:02丑牛
日期:2014-02-19 18:01:25卯兔
日期:2014-05-20 20:34:06白羊座
日期:2014-05-23 13:39:232015亚冠之大阪钢巴
日期:2015-08-07 20:57:582015亚冠之大阪钢巴
日期:2015-09-02 14:09:09
发表于 2013-03-11 18:19 |显示全部楼层
  1. sub hash2array { return %{$_[0]} }
  2. 用这个我试了没问题啊!
复制代码
回复 8# kk861123


   

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
发表于 2013-03-11 20:08 |显示全部楼层
回复 4# kk861123


    忘了插入顺序也是有影响的……如果两个key都在同一个槽中,那插入顺序 a b 还是 b a 在目前链表的实现中也是不一样的。

论坛徽章:
0
发表于 2013-03-12 10:58 |显示全部楼层
回复 12# 只是一个红薯


    恩,这个例子中,两个hash的数据存放是一致的。排序可以排除一些特列情况。

论坛徽章:
0
发表于 2013-03-12 11:03 |显示全部楼层
zhlong8 发表于 2013-03-11 20:08
回复 4# kk861123


能解释一下“槽”的概念吗?
插入顺序的影响是类似这样吗?我试过没影响...,我应该没理解到位
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use Data::Dumper;

  5. my (%m,%n);
  6. $m{a} = 1, $m{b} = 2;
  7. $n{b} = 2, $n{a} = 1;

  8. print hash2array(\%m), "\n"; # a1b2
  9. print hash2array(\%n), "\n"; # a1b2

  10. sub hash2array { return %{$_[0]} }
复制代码

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
发表于 2013-03-12 11:24 |显示全部楼层
回复 15# kk861123


    你上wiki 了解下哈希数据结构。核心就是把字符串变成数字(比如经典的 MD5 算法),把问题转换成数组的索引(这个数字就是数组的索引,通常数字很大需要对数组大小取余)。

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
发表于 2013-03-12 11:30 |显示全部楼层
我有个想法:利用sed把两个字符串相同的字符删去,最后得到空就表示匹配,非空就表示不匹配。
  1. sed -r ':1;s/(.*)(.)(.*) (.*)\2(.*)/\1\3 \4\5/;t1'
复制代码

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
发表于 2013-03-12 12:33 |显示全部楼层
  1. my ( %m, %n );
  2. my @a = 'a' .. 'z';
  3. my @b = 0 .. 25;

  4. sub Rand {
  5.     my ( @r, %h );
  6.     for ( 0 .. 25 ) {
  7.         my $r = int rand 26;
  8.         redo if $h{$r}++;
  9.         push @r, $r;
  10.     }
  11.     @r;
  12. }

  13. my @m = Rand;
  14. say '@m : ', join '|', @m;
  15. @m{ @a[@m] } = @m;
  16. my @n = Rand;
  17. say '@n : ', join '|', @n;
  18. @n{ @a[@n] } = @n;
  19. say '@b : ', join '|', @b;
  20. say '-' x 56;

  21. my @counter1 = hash2array( \%m );
  22. my @counter2 = hash2array( \%n );
  23. print '%m : ', "@counter1\n";
  24. print '%n : ', "@counter2\n";
  25. say '-' x 56;

  26. @m{@a}    = @b;
  27. @n{@a}    = @b;
  28. @counter1 = hash2array( \%m );
  29. @counter2 = hash2array( \%n );
  30. print '%m : ', "@counter1\n";
  31. print '%n : ', "@counter2\n";

  32. sub hash2array { return %{ $_[0] } }
复制代码
  1. @m : 9|11|24|3|0|20|4|10|17|5|14|6|8|13|23|1|22|7|2|25|15|18|19|21|16|12
  2. @n : 23|8|19|7|17|13|5|12|24|2|16|11|1|10|9|20|21|3|22|4|25|18|14|15|6|0
  3. @b : 0|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25
  4. --------------------------------------------------------
  5. %m : w 22 r 17 a 0 x 23 d 3 j 9 y 24 u 20 h 7 k 10 g 6 f 5 t 19 i 8 e 4 n 13 m 12 v 21 s 18 l 11 p 15 c 2 q 16 b 1 z 25 o 14
  6. %n : w 22 a 0 r 17 d 3 x 23 j 9 y 24 u 20 k 10 h 7 g 6 f 5 i 8 t 19 e 4 n 13 v 21 m 12 s 18 l 11 p 15 c 2 q 16 b 1 z 25 o 14
  7. --------------------------------------------------------
  8. %m : w 22 r 17 a 0 x 23 d 3 j 9 y 24 u 20 h 7 k 10 g 6 f 5 t 19 i 8 e 4 n 13 m 12 v 21 s 18 l 11 p 15 c 2 q 16 b 1 z 25 o 14
  9. %n : w 22 a 0 r 17 d 3 x 23 j 9 y 24 u 20 k 10 h 7 g 6 f 5 i 8 t 19 e 4 n 13 v 21 m 12 s 18 l 11 p 15 c 2 q 16 b 1 z 25 o 14
复制代码

论坛徽章:
0
发表于 2013-03-12 19:45 |显示全部楼层
回复 17# yestreenstars


    很好的idea,谢谢!可行:
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use Data::Dumper;
  5. use 5.012;

  6. my $str1 = 'abcda';
  7. my $str2 = 'adabc';

  8. my $str = $str1 . ' ' . $str2;
  9. 1 while $str =~ s/(\S*)(\S)(\S*) (\S*)\2(\S*)/$1$3 $4$5/g;

  10. print "|$str|\n";
  11. print $str eq ' ' ? 'Y' : 'N', "\n";
复制代码

论坛徽章:
0
发表于 2013-04-03 14:35 |显示全部楼层
回复 1# kk861123

大哥,你的QQ不在哎,想来这里请教你,因为上次那个程序真的很不错。


   

kk.rar

922.34 KB, 下载次数: 3

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP