免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
21 [报告]
发表于 2008-12-26 13:53 |只看该作者
微软还用perl?

面试 面世

论坛徽章:
1
辰龙
日期:2014-05-15 19:37:15
22 [报告]
发表于 2008-12-26 21:21 |只看该作者
人家当时的要求是,无论你用什么方法来写

论坛徽章:
0
23 [报告]
发表于 2008-12-27 01:13 |只看该作者
经典DP,开矩阵是对地,效率最高.

论坛徽章:
1
未羊
日期:2014-09-08 22:47:27
24 [报告]
发表于 2008-12-28 10:30 |只看该作者
Perl中可能效率不是最高也说不定。

论坛徽章:
1
IT运维版块每日发帖之星
日期:2016-07-05 06:20:00
25 [报告]
发表于 2009-01-02 13:36 |只看该作者
我是外行,不会编程。
不过,不知道“卷积”可行不?

论坛徽章:
0
26 [报告]
发表于 2009-01-05 22:48 |只看该作者
perl 新手, 写个试试

  1. #!/usr/bin/perl

  2. &max_index_of_two_string('xabcdxxxveafa', 'eabcafeveafaeagagade');

  3. sub max_index_of_two_string()
  4. {
  5.     my ($str1, $str2) = @_;
  6.     my $max_index_of_two_string = undef;
  7.     if (length($str1) < length($str2)) {
  8.         my $str = $str1;
  9.         $str1 = $str2;
  10.         $str2 = $str;
  11.     }
  12.     my $mark = 2;
  13.     while (length($str2) > 0) {
  14.         while ($mark <= length($str2)) {
  15.             my $pattern = substr($str2, 0, $mark);
  16.             if ($str1 =~ /$pattern/) {
  17.                 if (length($pattern) > length($max_index_of_two_string)) {
  18.                     $max_index_of_two_string = $pattern;
  19.                 }
  20.             }
  21.             $mark++;
  22.         }
  23.         if ($str2 =~ /(.)(.*)/) {
  24.             $str2 = $2;
  25.             $mark = 2;
  26.         }
  27.     }
  28.     print $max_index_of_two_string;
  29. }
复制代码

论坛徽章:
0
27 [报告]
发表于 2009-01-06 10:36 |只看该作者
my $str = $str1;
        $str1 = $str2;
        $str2 = $str;
标准c语言写法。
perl 写法:
($str1,$str2)=($str2,$str1);

论坛徽章:
0
28 [报告]
发表于 2009-01-06 12:06 |只看该作者
原帖由 machine 于 2009-1-6 10:36 发表
my $str = $str1;
        $str1 = $str2;
        $str2 = $str;
标准c语言写法。
perl 写法:
($str1,$str2)=($str2,$str1);

这样就可以swap了,又学到新东西啊。

论坛徽章:
0
29 [报告]
发表于 2009-03-11 16:49 |只看该作者
俺用 sql 写一个  oracle10g

select  max( replace ( sys_connect_by_path(a.t, '.'),'.') ) keep (dense_rank first order by level desc  )
   from (select rownum n, substr('abcdefg1234<*>', rownum, 1) t
           from dual
         connect by rownum <= length('abcdefg1234<*>')) a,
        
        (select rownum m, substr('12345defg1237123', rownum, 1) t
           from dual
         connect by rownum <= length('12345defg1237123')) b
  where a.t = b.t
connect by a.n = prior a.n + 1
        and b.m = prior b.m + 1

论坛徽章:
0
30 [报告]
发表于 2009-03-11 21:43 |只看该作者
原帖由 iakuf 于 2008-12-14 00:37 发表
回复1楼的:
sub string($$){
  my ($strmin,$strmax) = @_;
       for( my $i = 0; $i < length($strmax); $i++) {
           $lstrmin = substr($strmin, $i);
           my $nowstr;
           for(my $j=0; $j< length($lstrmin);$j++){
                 my @list=split '',$lstrmin;
                 $nowstr .= @list[$j];
                 if (index($strmax, $nowstr)>=1 && length($nowstr) > length($r)){
                        $r = $nowstr;
                }

        }
    }
        return  $r;
}


这个算法是从少到多的找,最好是从多到少的找,最长的即为最匹配的,你楼下的用正则的就是从最长开始找起,找到即是最长的.
所以我改了一下你的程序
sub mystring{
  my ($lstrmin,$r)=("","");
  my ($strmin,$strmax) = @_;
       for( my $i = 0; $i <length($strmin); $i++) {
           $lstrmin =substr($strmin,$i);
           my $nowstr;
           for(my $j=length($lstrmin); $j>length($r);$j--){
                 $nowstr =substr($lstrmin,0,$j);
                # print $nowstr;
                 if (index($strmax, $nowstr)>=1 && length($nowstr) > length($r)){
                        $r = $nowstr;
                        last;     
           }

        }
    }
        return  $r;
}

当然用到length函数的可以先定义一个标量,这样不会每次循环时都调用length.
你可以在你写的子例程里加入红色的print $nowstr,然后比较看一下我改的,可以发现到两个字符串很长的时候循环次数的差别.

你楼下的用正则的循环次数最少.
以上供参考
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP