免费注册 查看新帖 |

Chinaunix

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

微软面世试题-最大公共串-求两个字符串的最大公共子串的一个有意思的题目 [复制链接]

论坛徽章:
0
61 [报告]
发表于 2012-11-25 19:41 |只看该作者
machine 发表于 2008-12-15 09:01
我这个算法,用的是一个比较老套的lcs算法。以前用c写过,在perl下又模仿实现了一下。

算法大概描述就 ...

算法不错!!!!

论坛徽章:
3
CU十二周年纪念徽章
日期:2013-10-24 15:41:34子鼠
日期:2013-12-14 14:57:19射手座
日期:2014-04-25 21:23:23
62 [报告]
发表于 2012-11-26 11:23 |只看该作者
回复 59# gongyonghui2


    我也来试试看
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use Data::Dumper;
  5. my %hash1;
  6. my %hash2;
  7. my @arr;
  8. my $str1 = 'aab12345678';
  9. my $str2 = 'ab1234yb1234567';
  10. $str1 =~ /(.*?)(?{$hash1{$1}=$1})(*F)/;
  11. $str2 =~ /(.*?)(?{$hash2{$1}=$1})(*F)/;
  12.    for (keys %hash1){
  13.        my  $k = $_;
  14.         push  @arr,$k if exists $hash2{$k};   
  15.    }
  16.    my($max,$min)=sort{length($b) cmp length($a)}@arr;
  17.    for (@arr){
  18.     if(length($_)==length($max)){
  19.         print "$_\n";
  20.     }
  21.    }
  22. output:
  23. b1234567
复制代码

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
63 [报告]
发表于 2012-11-27 00:02 |只看该作者
回复 59# gongyonghui2


    多谢指正!

    确实如你所说,原来的代码是错误的。try:
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. my $str1 ="aab12345678";
  5. my $str2 = "ab1234yb1234567";
  6. my $str = $str1 . "\n" . $str2;

  7. my (@substr,@result);
  8. $str =~ /(.+)(?=.*\n.*\1)(*PRUNE)(?{push @substr,$1})(*F)/;
  9. @substr = sort { length($b) <=> length($a) } @substr;
  10. @result = grep { length == length $substr[0] } @substr;
  11. print "@result\n";
复制代码

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
64 [报告]
发表于 2012-11-27 00:13 |只看该作者
回复 62# mcshell


    学习!

论坛徽章:
3
CU十二周年纪念徽章
日期:2013-10-24 15:41:34子鼠
日期:2013-12-14 14:57:19射手座
日期:2014-04-25 21:23:23
65 [报告]
发表于 2012-11-27 00:18 |只看该作者
回复 64# blackold


    黑哥太谦虚了   多向黑哥请教才是

论坛徽章:
0
66 [报告]
发表于 2012-11-27 17:33 |只看该作者
machine 发表于 2008-12-15 09:01
我这个算法,用的是一个比较老套的lcs算法。以前用c写过,在perl下又模仿实现了一下。

算法大概描述就 ...


赞算法!

论坛徽章:
1
午马
日期:2013-11-25 16:01:44
67 [报告]
发表于 2012-11-28 11:52 |只看该作者
回复 63# blackold

不会用回溯控制,改了一下你的代码,这种方式也行:
#!/usr/bin/perl
use strict;
use warnings;

my $str1 ="aab12345678";
my $str2 = "ab1234yb1234567";
my $str = $str1 . "\n" . $str2;

my @substr=sort { length($b) <=> length($a) } map {substr($str,$_)=~/^(.+)(?=.*\n.*\1)/} 0..length($str1)-1;
my @result = grep { length == length $substr[0] } @substr;
print "@result\n";

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
68 [报告]
发表于 2012-11-28 12:07 |只看该作者
回复 67# gongyonghui2


  好!
学习!

论坛徽章:
0
69 [报告]
发表于 2012-11-28 13:58 |只看该作者
  1. #!/usr/bin/perl
  2. open STR1, '/opt/str1.txt';
  3. open STR2, '/opt/str2.txt';
  4. our $min;
  5. our $max;
  6. our $sum;
  7. $str1 = <STR1>;
  8. $str2 = <STR2>;
  9. $len   = length($str1);
  10. $max   = $len;
  11. $min   = 0;
  12. $point = int( $max / 2 );
  13. &match($point);
  14. sub match {
  15.     my ($point) = @_;
  16.     $end = $len - $point;
  17.     for $begin ( 0 .. $end ) {
  18.         $lcs= substr( $str1, $begin, $point );
  19.         if ( $str2 =~ /$lcs/ ) {
  20.             $aver = $max - $min;
  21.             if ( $aver <= 1 ) {
  22.                 print $lcs;
  23.                 exit;
  24.             }
  25.             else {
  26.                 $min = $point;
  27.                 $point = $min + int( ( $max - $min ) / 2 );
  28.                 &match($point);
  29.             }
  30.         }
  31.     }
  32.     $max = $point;
  33.     $point = $max - int( ( $max - $min + 1 ) / 2 );
  34.     &match($point);

  35. }
复制代码
二分法
如果公共子串较长有奇效

论坛徽章:
0
70 [报告]
发表于 2012-11-28 14:34 |只看该作者
machine 发表于 2008-12-15 09:01
我这个算法,用的是一个比较老套的lcs算法。以前用c写过,在perl下又模仿实现了一下。

算法大概描述就 ...


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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP