免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
11 [报告]
发表于 2008-12-15 11:05 |只看该作者
原帖由 khandielas 于 2008-12-14 06:33 发表
楼主写的象Perl写的C 程序

在Perl用hash作这些活比较典型了,

my ($str1, $str2) = @ARGV;
my %hash1;
my %hash2;
@hash1{split '', $str1} = ();
foreach ( split '', $str2) {
        if (exists $hash ...



请教@hash1{split '', $str1} = ();
这句话是什么意思?

论坛徽章:
1
未羊
日期:2014-09-08 22:47:27
12 [报告]
发表于 2008-12-15 18:36 |只看该作者
原帖由 machine 于 2008-12-15 09:01 发表

我这个算法,用的是一个比较老套的lcs算法。以前用c写过,在perl下又模仿实现了一下。

算法大概描述就是,分别用两个字符串作为横坐标和纵坐标建一个矩阵,遇到横竖字符相同的时候把这点的值设成1,否则设 ...

你这个算法可能是C语言优化的,用C语言可能效率很高。

论坛徽章:
0
13 [报告]
发表于 2008-12-15 19:31 |只看该作者
原帖由 machine 于 2008-12-15 09:01 发表

我这个算法,用的是一个比较老套的lcs算法。以前用c写过,在perl下又模仿实现了一下。

算法大概描述就是,分别用两个字符串作为横坐标和纵坐标建一个矩阵,遇到横竖字符相同的时候把这点的值设成1,否则设 ...

仰慕阿

论坛徽章:
0
14 [报告]
发表于 2008-12-16 10:43 |只看该作者
是的,这个算法我用c语言写过,效率确实不错,就是字符串大的时候建立矩阵比较占内存,还有自己清理(perl就好多了,自动清理)。现在就是不知道用perl实现起来是不是也很高效, 比 wxlfh 那个正则的算法比较那个效率更高? 高手能否帮分析一下。

论坛徽章:
0
15 [报告]
发表于 2008-12-16 13:24 |只看该作者
有空看看生物的 blast算法。。

论坛徽章:
0
16 [报告]
发表于 2008-12-17 10:47 |只看该作者
今天早上看自己的博客,又看到这个代码,突然发现,当初竟然犯傻了,既然都找到最大的公共字符串了,干嘛还要在遍历一遍散列呢,真的够傻的,惭愧啊。

#!perl


sub max_mutual_str {
  my($str1,$str2) = @_;
  my %cmp;
  my $max;
  my $beginning_station; #beginning station of the common string in $str1

  my @list1=split '',$str1;
  my @list2=split '',$str2;
  for my $i (0..$#list1){



    for my $j (0..$#list2){



       $cmp{$i.$j}=($list1[$i] eq $list2[$j]) ? (1+$cmp{($i-1).($j-1)}) : 0;
        if ($cmp{$i.$j}>$max){
           $max=$cmp{$i.$j};
           $beginning_station=$i+1-$max;
         }
       print "$cmp{$i.$j}";
    }
    print "\n";
  }

  return substr($str1,$beginning_station,$max);

}

my ($str1,$str2) = @ARGV;
my $str= max_mutual_str($str1,$str2);
print "$str\n";

论坛徽章:
0
17 [报告]
发表于 2008-12-17 14:26 |只看该作者
原帖由 machine 于 2008-12-15 09:01 发表

我这个算法,用的是一个比较老套的lcs算法。以前用c写过,在perl下又模仿实现了一下。

算法大概描述就是,分别用两个字符串作为横坐标和纵坐标建一个矩阵,遇到横竖字符相同的时候把这点的值设成1,否则设 ...


不得不赞一个

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
18 [报告]
发表于 2008-12-17 14:36 |只看该作者
原帖由 adminsinx 于 2008-12-15 11:05 发表



请教@hash1{split '', $str1} = ();
这句话是什么意思?

见 perldata 中的 Slices

论坛徽章:
1
辰龙
日期:2014-05-15 19:37:15
19 [报告]
发表于 2008-12-19 21:44 |只看该作者
sub string($$){
   ($strmin,$strmax) = @_;
       for( my $i = 0; $i < length($strmax); $i++) {
           $lstrmin = substr($strmin, $i);
           for(my $j=0; $j< length($lstrmin);$j++){
                chop($lstrmin);
                if (index($strmax, $lstrmin)>=1 && length($lstrmin) > length($r)){
                        $r = $lstrmin;
                }

            }
    }
        return  $r;
}


第4次改进

论坛徽章:
0
20 [报告]
发表于 2008-12-19 22:25 |只看该作者
原帖由 machine 于 2008-12-15 09:01 发表

我这个算法,用的是一个比较老套的lcs算法。以前用c写过,在perl下又模仿实现了一下。

算法大概描述就是,分别用两个字符串作为横坐标和纵坐标建一个矩阵,遇到横竖字符相同的时候把这点的值设成1,否则设 ...


呵呵,学习,还是第一次见这个算法
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP