- 论坛徽章:
- 0
|
本帖最后由 kk861123 于 2013-03-12 10:58 编辑
无意中翻到2gua的博客,看到这个题目:
看到一个据说是腾讯面试时有关一个字符串比较的题:
假设两个字符串中所含有的字符和个数都相同我们就叫这两个字符串匹配,比如:abcda和adabc,由于出现的字符个数都是相同,只是顺序不同,所以这两个字符串是匹配的。要求高效!
这是python的解决方案:http://blog.chinaunix.net/uid-16111523-id-3345463.html 说白了就是排序,sorted的方法,用perl来做的方法大约为:- #!/usr/bin/perl
- use strict;
- use warnings;
- use Data::Dumper;
- use 5.012;
- my $str1 = 'abcda';
- my $str2 = 'adabc';
- my @x = sort2array($str1);
- my @y = sort2array($str2);
- if ( @x ~~ @y ) {
- print "Y\n";
- } else {
- print "N\n";
- }
- sub sort2array { return sort(split //,$_[0]) }
复制代码 不过接着就有人质疑,如果字符串很长的情况下使用排序就不是什么好方法了,2gua给出的Counter用法,和perl的hash计算后再比较kv值如出一辙,且发现一个关于hash中数据存放的问题,请能给解释下?- #!/usr/bin/perl
- use strict;
- use warnings;
- use Data::Dumper;
- my $str1 = 'abcda';
- my $str2 = 'adabc';
- my (%m,%n);
- $m{$_}++ for split //,$str1;
- $n{$_}++ for split //,$str2;
- # 为什么两个hash的数据存放顺序是一致的?我说的对吗?谁给解释下?
- my @counter1 = hash2array(\%m);
- my @counter2 = hash2array(\%n);
- print "@counter1\n";
- print "@counter2\n";
- if ( @counter1 ~~ @counter2 ) {
- print "Y\n";
- }
- # 转为数组进行智能匹配
- sub hash2array { return %{$_[0]} }
复制代码 另外,还想了一种方法用正则来处理,也请大家一起看看哪种效率会高点?- #!/usr/bin/perl
- use strict;
- use warnings;
- use Data::Dumper;
- my $str1 = 'abcda';
- my $str2 = 'adabc';
- print newMatch($str1,$str2), "\n";
- sub newMatch{
- my ($str1, $str2) = @_;
- return 'N' if length($str1) != length($str2);
- my $is_match = 'Y';
- while ( $str1 =~ s/.// ) {
- unless ( $str2 =~ s/$&// ) {
- $is_match = 'N';
- }
- }
- return $is_match;
- }
复制代码 |
|