首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 服务器 > IIS >

怎么找到一篇文章中重复的字符串

2012-04-12 
如何找到一篇文章中重复的字符串?比如说一篇中文章(纯文本文件),(可能某些字符串之间以“回车”“换行”符分隔

如何找到一篇文章中重复的字符串?
比如说一篇中文章(纯文本文件),(可能某些字符串之间以“回车”“换行”符分隔,也可能整篇文章都没有“回车”“换行”符),现定义一个长度为N的字符串,如何找出整个文章(文件)中长度为N的字符串的重复次数并删除长度为N的第一次出现以后的重复字符串?


比如说N=4时,在下文中,“获得股票”多次重复出现了多次,如何在一个可能长约几十万字的文章中找出多次出现的长度为N的字符串?

-----------------------------------------------------
什么是股票?股票是一种由股份有限公司签发的用以证明股东所持股份的凭证,它表明股票的持有者对股份公司的部分资本拥有所有权。由于股票包含有经济利益,且可以上市流通转让,股票也有一种有价证券。 
  股票的用途有三点。其一是作为一种出资证明,当一个自然人或法人向股份有限公司参股投资时,便可获得股票作为出资的凭据;其二是股票的持有者可凭借股票来证明自己的股东身份,参加股份公司的股东大会,对股份公司的经营发表意见;其三是股票持有人凭借着股票可获得一定的经济利益,参加股份公司的利润分配,也就是通常所说的分红。 
  在现实的经济活动中,人们获取股票通常有四种途径。其一是作为股份有限公司的发起人而获得股票,如我国许多上市公司都由国有独资企业转为股份制企业,原企业的部分财产就转为股份公司的股本,相应地原有企业就成为股份公司的发起人股东。其二是在股份有限公司向社会募集资金而发行股票时,自然人或法人出资购买的股票,这种股票通常被称为原始股。其三是在二级流通市场上通过出资的方式受让他人手中持有的股票,这种股票一般称为二手股票,这种形式也是我国股民获取股票的最普遍形式。其四是他人赠与或依法继承而获得股票。
------------------------------------------------------

[解决办法]
思路:

每次取两行出来,把其中的回车换行符找到,记下位置,然后删除。然后在得到的字符串里搜索替换要找的字符串,找完之后把回车换行符再插回去。
然后下移一行,重复以上操作,直到文本末尾。
[解决办法]
将数据加载到数组中,做循环判断判断
[解决办法]
不明白你说的长度有什么用。
如果是单纯统计子字符串重复出现的次数,用正则最简单,效率还可以。
如果想替换,可以使用instr循环查找,对第一次结果忽略,只替换后面出现的,只不过要注意循环的上限,因为替换值与子字符串长度不一样时,上限为变量值。
如果要考虑效率,VB的instr速度是最快的,其次是strstrA和strstrW,再次是正则,最差是自己写代码(毕竟VB没有指针,安全数组寻址时计算太多)。
[解决办法]
几十万汉字一次性读入到内存没多大问题吧?好象记得即使100万也不占多大内存....
然后用简单的方法(不是高效的方法):
msgbox ubound(split(replace(sFile,vbclf,vbnullstring),"获得股票"))
就是先替换掉所有回车符,再处理,可能也不慢....
高效的方法当然是instr,现在手边没有VB,楼主可以测试一下....

[解决办法]
最关键的一点楼上各位都忽略了,“获得股票”本身也可能包含换行符和回车符
[解决办法]
没明白你说什么.....
1:程序能自身判断[问题]是一个词语吗?好像没有这么智能
[解决办法]
杀毒软件的扫描方式,你可以试试这种方式
[解决办法]
看到你这个想起冒泡排序

1:先取样本mid(str,i,N)'截取长度,如果N=1,就直接遍历键盘上可能出现的字符
2:然后再遍历整个长度,或者,直接replace后面的东西,不管他是否有,
[解决办法]
先取前4个字母的子串,然后从第5位每4位

你这个方法不行,如果是
123456789A2345A6789
你的这个方法,有点像360的流氓行为
[解决办法]
2345被你截断了
[解决办法]
多线程,,,,,,,,,,,,,,,啊啊啊啊啊 啊啊啊啊 啊

一次取N个字符,就开个N个线程,查出有重复的.最后汇总,替换有存在的
[解决办法]
除了关注,我只能关注
[解决办法]

探讨
比如上面那段话,如果长度单位是字节,当N=2时,“其”字就是重复的,当N=8时“获得股票”是重复的,那么当我国输入N=4或其它任意输入值时时,有哪些重复的呢?删除这些重复的(只保留第一次出现的子串)之后的文章是什么呢?


这个才是我想问的问题。

[解决办法]
字典算法:

如果串长度是确定的,只需要逐字符扫描一次。

如果当前位置 N 字符的串是新字,则写入字典。如果不是,则记下它的起始位置。(注意,如果它小于上一个重复记录起始位置 + N ,则不记,否则重复删除)。


[解决办法]
看贴回贴,路过,踩踩!!
[解决办法]
探讨
字典算法:

如果串长度是确定的,只需要逐字符扫描一次。

如果当前位置 N 字符的串是新字,则写入字典。如果不是,则记下它的起始位置。(注意,如果它小于上一个重复记录起始位置 + N ,则不记,否则重复删除)。





[解决办法]
if len(replace(string1,string2,space(len(string2)+1)))-len(string1)>1 then
debug.print replace(string1,string2,"")
endif


[解决办法]
感觉LZ有点走入误区了,并不是找N=4的字符串,而是查找你要查找的字符串,如你的“获得彩票”
你可以定义一个数组M(),用M=SPLIT(A,"获得彩票")
N=UBOUND(M)


注:我也是初学,以上代码是手写,可能有错误,大概思路就是那样
[解决办法]
探讨
感觉LZ有点走入误区了,并不是找N=4的字符串,而是查找你要查找的字符串,如你的“获得彩票”
你可以定义一个数组M(),用M=SPLIT(A,"获得彩票")
N=UBOUND(M)


注:我也是初学,以上代码是手写,可能有错误,大概思路就是那样

[解决办法]
如果只是通過字符串長度來,只能通過循環處理的方式,電腦運算一億次也不用多久時間,不行,再加大硬件投入,整個小型機或中型機,看丫的還慢不慢?。在循環體中,盡量使用最優化的代碼。合理利用instr()與Replace()函數。
[解决办法]
VB code
[code=VB]Private Sub Form_Load()    Dim reg  As Object, matchs As Object    Dim i%, j%        Set reg = CreateObject("vbscript.regexp")    reg.ignorecase = True    reg.Global = True    reg.MultiLine = True        reg.Pattern = "(?:(.{4}).+?\1)"    Set matchs = reg.Execute("123456781234gabcdg1234g45h6hrabcdhn1234kytknnihao,nihao,nihaoaaa")        For i = 0 To matchs.Count - 1        If matchs(i).SubMatches.Count > 0 Then            Debug.Print matchs(i).SubMatches(0)        End If    NextEnd Sub'===================='1234'abcd'niha
[解决办法]
String 数据类型


字符串有两种:变长与定长的字符串。 

变长字符串最多可包含大约 20 亿 ( 2^31)个字符。


定长字符串可包含 1 到大约 64K ( 2^16 ) 个字符。 

==========msdn

哈哈不用担心了
[解决办法]
VB code
'靠,搞得那么变态的~~~~,~~~~'不过还是很容易解决的。呵呵。'--------------------------------------------'),(可能某些字符串之间以“回车”“换行”符分隔,也可能整篇文章都没有“回车”“换行”符),'--------------------------------------------'' 先问问再回答。字符包括空格嘛?不包括空格就简单,包括的话累死你~~~~~~~~~~
[解决办法]
其实 split 也能做到
不过我想,自己用循环优化的话,速度可能更为理想一点

要多用一些算法之类的, 通常这种东西都是很耗时的,能避免尽量避免

比如只计算屏幕上要显示会马上就需要处理的部分,剩余的部分需要时再做,这样效果会更好
[解决办法]
规则不明确!

比如 12341123452345
位置 123456789ABCDE

按照单词 1234,第 5-9 字符的 1234 作为第二组应该删除删除,
可是按照单词 2345, 第 5-A 字符的 2345 作为第一组应该保留。
[解决办法]
更正:
第 6-9 字符的 1234 
第 7-A 字符的 2345

热点排行