日期:2014-05-16  浏览次数:21562 次

如何找到一篇文章中重复的字符串?
比如说一篇中文章(纯文本文件),(可能某些字符串之间以“回车”“换行”符分隔,也可能整篇文章都没有“回车”“换行”符),现定义一个长度为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 ,则不记,否则重复删除)。