原帖由 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 ...
#!/usr/bin/perl #闲着没事我也写一个,呵呵 sub max_mutual_str { my($str1,$str2) = @_; my %cmp; my $max; my @list1=split '',$str1; my @list2=split '',$str2; for(my $i=0;$i<$#list1+1;$i++){ for(my $j=0;$j<$#list2+1;$j++){ $cmp{$i.$j}=($list1[$i] eq $list2[$j]) ? (1+$cmp{($i-1).($j-1)}) : 0; $max=$cmp{$i.$j} if ($cmp{$i.$j}>$max); print "$cmp{$i.$j}"; } print "\n"; } for (keys %cmp){ if ($cmp{$_} == $max ){ my $offset=substr($_,0,1)+1-$max; return substr($str1,$offset,$max); } } } my ($str1,$str2) = @ARGV; my $str= max_mutual_str($str1,$str2); print "$str\n"; |
m | a | c | h | i | |
a | 0 | 1 | 0 | 0 | 0 |
b | 0 | 0 | 0 | 0 | 0 |
m | 1 | 0 | 0 | 0 | 0 |
a | 0 | 1 | 0 | 0 | 0 |
c | 0 | 0 | 1 | 0 | 0 |
m | a | c | h | i | |
a | 0 | 1 | 0 | 0 | 0 |
b | 0 | 0 | 0 | 0 | 0 |
m | 1 | 0 | 0 | 0 | 0 |
a | 0 | 2 | 0 | 0 | 0 |
c | 0 | 0 | 3 | 0 | 0 |
#!perl sub max_mutual_str { my($str1,$str2) = @_; my %cmp; my $max; 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; $max=$cmp{$i.$j} if ($cmp{$i.$j}>$max); print "$cmp{$i.$j}"; } print "\n"; } for (keys %cmp){ if ($cmp{$_} == $max ){ my $offset=substr($_,0,1)+1-$max; return substr($str1,$offset,$max); } } } my ($str1,$str2) = @ARGV; my $str= max_mutual_str($str1,$str2); print "$str\n"; |
原帖由 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 ...
原帖由 machine 于 2008-12-15 09:01 发表
我这个算法,用的是一个比较老套的lcs算法。以前用c写过,在perl下又模仿实现了一下。
算法大概描述就是,分别用两个字符串作为横坐标和纵坐标建一个矩阵,遇到横竖字符相同的时候把这点的值设成1,否则设 ...
原帖由 machine 于 2008-12-15 09:01 发表
我这个算法,用的是一个比较老套的lcs算法。以前用c写过,在perl下又模仿实现了一下。
算法大概描述就是,分别用两个字符串作为横坐标和纵坐标建一个矩阵,遇到横竖字符相同的时候把这点的值设成1,否则设 ...
#!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"; |
原帖由 machine 于 2008-12-15 09:01 发表
我这个算法,用的是一个比较老套的lcs算法。以前用c写过,在perl下又模仿实现了一下。
算法大概描述就是,分别用两个字符串作为横坐标和纵坐标建一个矩阵,遇到横竖字符相同的时候把这点的值设成1,否则设 ...
原帖由 machine 于 2008-12-15 09:01 发表
我这个算法,用的是一个比较老套的lcs算法。以前用c写过,在perl下又模仿实现了一下。
算法大概描述就是,分别用两个字符串作为横坐标和纵坐标建一个矩阵,遇到横竖字符相同的时候把这点的值设成1,否则设 ...
原帖由 machine 于 2009-1-6 10:36 发表
my $str = $str1;
$str1 = $str2;
$str2 = $str;
标准c语言写法。
perl 写法:
($str1,$str2)=($str2,$str1);
原帖由 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;
}
原帖由 wxlfh 于 2008-12-14 15:10 发表
自己搞了个,班门弄斧,呵呵
sub max_mutual_str {
my($min,$max) = @_;
if (length($min)>length($max)) {
($min,$max) = ($max,$min);
}
my $len = length($min);
foreach my $rest (0..$len-1 ...
欢迎光临 Chinaunix (http://bbs.chinaunix.net/) | Powered by Discuz! X3.2 |