- 论坛徽章:
- 0
|
原帖由 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,然后比较看一下我改的,可以发现到两个字符串很长的时候循环次数的差别.
你楼下的用正则的循环次数最少.
以上供参考 |
|