求助:字符串处理
-
- 帖子: 40
- 注册时间: 2012-01-28 21:27
求助:字符串处理
有如下两个需求,请各位大牛帮忙,谢谢!
------------------------------------------
1、如何判断两个字符串是否含有相同字母
譬如
oobk
kboo
okob
koob
与book相同
而
bok
handbook
boot
与book不同
2、如何对一个字符串中的字符进行重新排序
abandon
abbreviation
abide
ability
able
abnormal
aboard
abolish
about
above
处理后变为
aabdnno
aabbeiinortv
abdei
abiilty
abel
aablmnor
aabdor
abhilos
abotu
abeov
关于问题2,我有一个非常笨拙的处理办法,如下
echo $Curword | sed 's/[a-z]/& /g' |xargs -n1 |sort |xargs |sed 's/ //g'
刚刚测试了一下,处理6000个字符串需要8分钟左右,故需要寻求高效的处理方式。
------------------------------------------
1、如何判断两个字符串是否含有相同字母
譬如
oobk
kboo
okob
koob
与book相同
而
bok
handbook
boot
与book不同
2、如何对一个字符串中的字符进行重新排序
abandon
abbreviation
abide
ability
able
abnormal
aboard
abolish
about
above
处理后变为
aabdnno
aabbeiinortv
abdei
abiilty
abel
aablmnor
aabdor
abhilos
abotu
abeov
关于问题2,我有一个非常笨拙的处理办法,如下
echo $Curword | sed 's/[a-z]/& /g' |xargs -n1 |sort |xargs |sed 's/ //g'
刚刚测试了一下,处理6000个字符串需要8分钟左右,故需要寻求高效的处理方式。
- 枫叶饭团
- 帖子: 14683
- 注册时间: 2010-06-16 1:05
- 系统: Mac OS X
- 来自: Tencent
- 联系:
- eexpress
- 帖子: 58428
- 注册时间: 2005-08-14 21:55
- 来自: 长沙
-
- 帖子: 40
- 注册时间: 2012-01-28 21:27
Re: 求助:字符串处理
谢谢!
其实,目的只有一个,我想分析一下6级词汇库里的单词那些是字母完全一样,唯一不同的是排序方法。
譬如下面词汇就属于这类
----------------------------------------------
asleep
elapse vi.(时间)过去,消逝
----------------------------------------------
backward
drawback n.退款;妨碍;弊端
----------------------------------------------
battle
tablet n.碑,匾;药片
----------------------------------------------
below
elbow n.肘,肘部;弯管vt.用肘挤,挤进
方法不限,用perl也可以,最近正在学perl,还没入门!
其实,目的只有一个,我想分析一下6级词汇库里的单词那些是字母完全一样,唯一不同的是排序方法。
譬如下面词汇就属于这类
----------------------------------------------
asleep
elapse vi.(时间)过去,消逝
----------------------------------------------
backward
drawback n.退款;妨碍;弊端
----------------------------------------------
battle
tablet n.碑,匾;药片
----------------------------------------------
below
elbow n.肘,肘部;弯管vt.用肘挤,挤进
方法不限,用perl也可以,最近正在学perl,还没入门!
- HuntXu
- 帖子: 5776
- 注册时间: 2007-09-29 3:09
Re: 求助:字符串处理
第一個,參數是兩個單詞,samechars("book", "koob")這樣子,1是相同
[perl]
sub samechars
{
my $word = join "", sort split //, shift;
return 1 unless $word cmp join "", sort split //, shift;
0;
}
[/perl]
第二個,整個單詞表變數組
[perl]
foreach(@words)
{
push @sorted_words, join "", sort split //;
}
[/perl]
文件的話直接
$ perl -ne 'chomp; print join "", sort split //;print "\n"' word
[perl]
sub samechars
{
my $word = join "", sort split //, shift;
return 1 unless $word cmp join "", sort split //, shift;
0;
}
[/perl]
第二個,整個單詞表變數組
[perl]
foreach(@words)
{
push @sorted_words, join "", sort split //;
}
[/perl]
文件的話直接
$ perl -ne 'chomp; print join "", sort split //;print "\n"' word
HUNT Unfortunately No Talent...
- josephyoung
- 帖子: 158
- 注册时间: 2011-11-05 18:53
- 来自: 南极圈
Re: 求助:字符串处理
第2问:
有了第二问,第一问就很简单了,不过没看懂你第一问具体要搞什么
代码: 全选
awk '{a="";split($0,A,"");asort(A);for(i=0;i++<length(A);)a=a A[i];print a}' file
- josephyoung
- 帖子: 158
- 注册时间: 2011-11-05 18:53
- 来自: 南极圈
Re: 求助:字符串处理
第一题:
[python]print sorted(a) == sorted(b) and 'same' or 'different'
[/python]
第二题:
[python]print "".join(sorted(word))
[/python]
[python]print sorted(a) == sorted(b) and 'same' or 'different'
[/python]
第二题:
[python]print "".join(sorted(word))
[/python]
- 枫叶饭团
- 帖子: 14683
- 注册时间: 2010-06-16 1:05
- 系统: Mac OS X
- 来自: Tencent
- 联系:
Re: 求助:字符串处理
我就知道用python简单,可惜我把这部分跳过去了...josephyoung 写了:第一题:
[python]print sorted(a) == sorted(b) and 'same' or 'different'
[/python]
第二题:
[python]print "".join(sorted(word))
[/python]

-
- 帖子: 919
- 注册时间: 2009-07-01 22:04
Re: 求助:字符串处理
a=bok;b=boko;[[ $(grep -o '.' <<<$a$b|sort|sed -r 'N;s/(.)\n\1//') ]] && echo different || echo same
different
#都在说什么?
#用什么都正确,只不过需要一点算法。
different
#都在说什么?
#用什么都正确,只不过需要一点算法。
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
-
- 帖子: 919
- 注册时间: 2009-07-01 22:04
Re: 求助:字符串处理
kose3@kose3-laptop:~$ cat file
----------------------------------------------
asleep
elapse vi.(时间)过去,消逝
----------------------------------------------
backward
drawback n.退款;妨碍;弊端
----------------------------------------------
battle
tablet n.碑,匾;药片
----------------------------------------------
below
elbow n.肘,肘部;弯管vt.用肘挤,挤进
kose3@kose3-laptop:~$ A=1;B=A;C=B;eval echo \$${!C}
1
kose3@kose3-laptop:~$ cat file
----------------------------------------------
asleep
elapse vi.(时间)过去,消逝
----------------------------------------------
backward
drawback n.退款;妨碍;弊端
----------------------------------------------
battle
tablet n.碑,匾;药片
----------------------------------------------
below
elbow n.肘,肘部;弯管vt.用肘挤,挤进
sed -r '/^-+/d;s/(\w+).*/\1/' file|awk '{split($0,a,"");asort(a);for(i in a){printf a};print " "$0}'|sort -k1|awk '{if(NR !=1 && v != $1){print c;c=0};v=$1;c++;print $2}END{print c}'
backward
drawback
2
asleep
elapse
2
battle
tablet
2
below
elbow
2
#大概这样吧。
----------------------------------------------
asleep
elapse vi.(时间)过去,消逝
----------------------------------------------
backward
drawback n.退款;妨碍;弊端
----------------------------------------------
battle
tablet n.碑,匾;药片
----------------------------------------------
below
elbow n.肘,肘部;弯管vt.用肘挤,挤进
kose3@kose3-laptop:~$ A=1;B=A;C=B;eval echo \$${!C}
1
kose3@kose3-laptop:~$ cat file
----------------------------------------------
asleep
elapse vi.(时间)过去,消逝
----------------------------------------------
backward
drawback n.退款;妨碍;弊端
----------------------------------------------
battle
tablet n.碑,匾;药片
----------------------------------------------
below
elbow n.肘,肘部;弯管vt.用肘挤,挤进
sed -r '/^-+/d;s/(\w+).*/\1/' file|awk '{split($0,a,"");asort(a);for(i in a){printf a};print " "$0}'|sort -k1|awk '{if(NR !=1 && v != $1){print c;c=0};v=$1;c++;print $2}END{print c}'
backward
drawback
2
asleep
elapse
2
battle
tablet
2
below
elbow
2
#大概这样吧。
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
- tangboyun
- 帖子: 701
- 注册时间: 2009-07-25 1:57
- 联系:
Re: 求助:字符串处理
用sort是低效的方式,这里有个特殊的地方,因为都是单词,而且不需要区分大小写,所以一个26字符长的数组即可储存一个单词的所有信息。每个词只要扫一遍即可,然后比较数组,只要有一位不同即可跳出。
https://github.com/tangboyun
http://tangboyun.is-programmer.com/
提问的智慧————Eric Steven Raymond
回答的智慧————Andrew Clarke
吾尝终日而思矣,不如须臾之所学也;吾尝跂而望矣,不如登高之博见也。
急急急标题什么的,最讨厌了!
急急复急急,急急何其多,我生待急急,万事急急急。
http://tangboyun.is-programmer.com/
提问的智慧————Eric Steven Raymond
回答的智慧————Andrew Clarke
吾尝终日而思矣,不如须臾之所学也;吾尝跂而望矣,不如登高之博见也。
急急急标题什么的,最讨厌了!
急急复急急,急急何其多,我生待急急,万事急急急。
-
- 帖子: 40
- 注册时间: 2012-01-28 21:27
Re: 求助:字符串处理
谢谢诸位,都是好方法!
其中的精妙我要慢慢体会。
其中的精妙我要慢慢体会。
-
- 帖子: 919
- 注册时间: 2009-07-01 22:04
Re: 求助:字符串处理
只运行一次的话很高效的,要多次运行的话用awk更高效。tangboyun 写了:用sort是低效的方式,这里有个特殊的地方,因为都是单词,而且不需要区分大小写,所以一个26字符长的数组即可储存一个单词的所有信息。每个词只要扫一遍即可,然后比较数组,只要有一位不同即可跳出。
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
-
- 帖子: 919
- 注册时间: 2009-07-01 22:04
Re: 求助:字符串处理
kose-1@kose-1-desktop:~$ wc -l file2
599988 file2
#file2是把file扩展为约60万行。
kose-1@kose-1-desktop:~$ time sed -r '/^-+/d;s/(\w+).*/\1/' file2|awk '{split($0,a,"");asort(a);for(i in a){printf a};print " "$0}'|sort -k1|awk '{if(NR !=1 && v != $1){print c;c=0};v=$1;c++}END{print c}'
99998
99998
99998
99998
real 0m13.160s
user 0m12.750s
sys 0m0.140s
#去除打印单词处理时间约13秒,应该是可以接受的范围。(不同的具体情况用不同的具体算法以提高效率是需要的)
#其中已经对约40万单词分别进行了字母排序,sort也对数十万单词进行了一次排序。
599988 file2
#file2是把file扩展为约60万行。
kose-1@kose-1-desktop:~$ time sed -r '/^-+/d;s/(\w+).*/\1/' file2|awk '{split($0,a,"");asort(a);for(i in a){printf a};print " "$0}'|sort -k1|awk '{if(NR !=1 && v != $1){print c;c=0};v=$1;c++}END{print c}'
99998
99998
99998
99998
real 0m13.160s
user 0m12.750s
sys 0m0.140s
#去除打印单词处理时间约13秒,应该是可以接受的范围。(不同的具体情况用不同的具体算法以提高效率是需要的)
#其中已经对约40万单词分别进行了字母排序,sort也对数十万单词进行了一次排序。
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
-
- 帖子: 919
- 注册时间: 2009-07-01 22:04
Re: 求助:字符串处理
........
aeelps
aabcdkrw
aabcdkrw
abeltt
abeltt
below
below
real 0m40.398s
user 0m15.050s
sys 0m4.510s
kose-1@kose-1-desktop:~$ time sed -r '/^-+/d;s/(\w+).*/\1/' file2|awk '{c=split($0,a,"");asort(a);for(i=1;i<=c;i++){printf a};printf "\n"}'
#实测处理60万行40万单词的文件每个单词字母排序包括打印约40秒。
aeelps
aabcdkrw
aabcdkrw
abeltt
abeltt
below
below
real 0m40.398s
user 0m15.050s
sys 0m4.510s
kose-1@kose-1-desktop:~$ time sed -r '/^-+/d;s/(\w+).*/\1/' file2|awk '{c=split($0,a,"");asort(a);for(i=1;i<=c;i++){printf a};printf "\n"}'
#实测处理60万行40万单词的文件每个单词字母排序包括打印约40秒。
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。