简单的文章查重

24
回复
1674
查看
[复制链接]

9

主题

13

帖子

60

安币

程序猿

Rank: 2

QQ达人

发表于 2015-12-30 15:03:17 | 显示全部楼层 |阅读模式
本帖最后由 Tse.ye 于 2015-12-30 18:08 编辑

第一种:找出两个字符串的公共子串,简单粗暴,但是效率不高

[Java] 查看源文件 复制代码
 String aaa = "而如若按对角线为行,一行行计算的话,其实就只需要缓存下一个数据就可以将对角线上的格子填充完毕。从字符串上讲,就是偏移一个字符串的头,然后跟另一个字符串比较看在如此固定的位置下能找到最长的公共子串是多长。";
                String bbb = "在填充这张表的过程中,算法是从上往下一行一行计算,然后每行是从左往右。对于每一格,要知道它左上格是什么值,这就导致需要保留一整行的数据信息。但如果只针对一格看,它需要知道的只是左上格,而它的左上格又只要知道左上格的左上格就足够了,于是就是一个对角线的路径。";
                int longest = 0;
                boolean toBreak = false;
                List<String>result = new ArrayList<String>();
                long currentTime = System.currentTimeMillis();
                for(int i=1;i<aaa.length();i++){
                        //最外层循环是用来遍历可以比较的长度的
                        //这种算法i只是拿来做长度的参考 就是每次要比较的长度
                        //先遍历的是String aaa
                        //所以当String aaa的长度 大于 Stringbbb的时候 就没有比较的必要了
                        toBreak = false;
                        if(i>=bbb.length())
                                //比如A长度为5 B长度为3  那么长度4的A肯定是匹配不到B的
                                break;
                        for(int z = 0;z<aaa.length();z++){
                                //z是用来遍历A的
                                int aaStart = z;
                                int bbStart = 0;
                                if(toBreak)
                                        //如果只是要获取两个字符串中最长公共子串的长度的话  这样会提高一点效率
                                        //只要已经获取到i长度的公共子串了 那么相同长度的其他子串就不用比较了
                                        //如果是要获取所有最长的公共子串的话 那么只要获取到最长子串的长度后 再循环一次去获取所有该长度的公共子串就可以了
                                        break;
                                while(aaStart+i<=aaa.length()&&bbStart+i<=bbb.length()){
                                        //该层循环是用来遍历B的
                                        String tAAA = aaa.substring(aaStart, aaStart+i);
                                        String tBBB = bbb.substring(bbStart, bbStart+i);
                                        if(tAAA.equals(tBBB))
                                        {
                                                result.add(tAAA);;
                                                longest = i;
                                                toBreak = true;
                                                break;
                                        }
                                        bbStart++;
                                }
                        }
                                
                                
                                
                        }
                System.out.println(System.currentTimeMillis()-currentTime+":"+longest+":"+result);


比较简单粗暴的一种方法
运行结果如下:
74:3:[而, 对角, 对角线]

第二种:先把基数变小,再进行查重,效率比第一种高太多
[Java] 查看源文件 复制代码
String texta = "家传统的制造业公司如何转型?\r\n"
				+ "我觉得不是“转”,而是“拆”,即裂变。\r\n"
				+ "“拆”的心法,是把钱的作用发挥到极致。也就是——\r\n"
				+ "用人民币投票。\r\n"
				+ "从芬尼公司中,陆续裂变出多家新公司。裂变公司的总经理一般都是任命,但当我们开始做一家互联网公司的时候,就遇到了难题,因为我们并不知道新公司的总经理用什么人选合适。\r\n"
				+ "想过从外面找人,没有找到。最后没办法,才想到了竞赛的方式。\r\n"
				+ "但是,问题来了,怎么选拔?\r\n"
				+ "我们经常搞比赛,例如唱歌比赛。我们常会发现评委都是不理性的,假如女生上来唱歌,唱得很好,给9.5分;她长得很美,一激动就给了9.8分;她再会说话一些,给10分!就算是任何人做评委都会有这种感情用事的情况。\r\n"
				+ "为什么会这样?\r\n"
				+ "因为不管谁上去,和他自身的利益都不是紧密相关的。但我们要选的是股东级的总经理,必须要严肃地选出真人才。\r\n"
				+ "2010年年底,芬尼举办了内部的第一届创业大赛,PK的主题是:“假如我是互联网营销公司的总经理。”\r\n"
				+ "为了调动企业内部全员参与的热情,我们设计了一张独特的选票。\r\n"
				+ "为了这张选票,我苦苦思考了两个月,一是下决心,因为经营这个新公司难度很大,搞不好会伤筋动骨;二是怎样把最合适的人选出来,而且要让公司上上下下全力以赴地支持新公司。\r\n"
				+ "这张选票的设计并不复杂,一共才三行:\r\n"
				+ "第一行:你选谁?例如小张;\r\n"
				+ "第二行:你投他多少钱?例如5万元;\r\n"
				+ "第三行:签上投票人的名字。\r\n"
				+ "具体的评选方法:\r\n"
				+ "1.有投资资格的人只能投一票,额度根据职位高低设定上限。\r\n"
				+ "2.员工写在选票上的金额如不兑现,罚款上一年年收入的20%。\r\n"
				+ "3.选民投资的人选与PK胜出者不符,有权修改人选,但只能排在候选,不保证有资格投资,同时投资比例需要打折。\r\n"
				+ "4.竞选人及竞选团队要申明其个人投资额度,带头人投资要超过首期投资的10%以上,自己不投资不得参赛。\r\n"
				+ "5.获得投资额最大者获胜。\r\n"
				+ "比赛告示张贴后,揭榜的有14个队,平均每个队4个人,共有60多个员工参与。\r\n"
				+ "为什么会有这么多人报名?\r\n"
				+ "主要是因为前面裂变的四家公司都挣钱,它们的总经理收入都相对较高,榜样的力量是无穷的。同时,因为前面的案例,员工对公司要创立一个新的公司深信不疑,机会对每个蠢蠢欲动的人都有极大的诱惑,而且这一次不同的是:看起来人人都有机会。\r\n"
				+ "通常民营企业是个独裁社会,老板认为谁行,谁就有机会上位,老板认为谁不行,再努力似乎也没用,而比赛让大家都有机会。但是大部分员工从来没有想过一个富士康要变成苹果有多困难。所以员工的信心对企业推行变革最为重要,如果员工对老板和企业没有信心,不跟你玩,企业什么创新也推动不了。\r\n"
				+ "比赛的场面就跟喷了血一样,最后单是员工投资就有950万元。我最后整体等比例打折,把资金盘子定为1500万元,创业团队和员工投了一半,我和联合创始人投了另一半。当所有人对目标怀有坚定信心的时候,大家不会怀疑只会跟随,而信心的形成是因为看到一个个用成功而铸就的先例。因为群众投资太热情,在这样的情况下投资新公司就变成了一种机遇,那员工在日常的工作中怎会不拼命。\r\n"
				+ "那么问题来了——\r\n"
				+ "为什么钱可以选出德才兼备的总经理?\r\n"
				+ "如果你面临这样一张选票,会把钱投给什么样的人?\r\n"
				+ "第一因素考虑的一定是人品,也就是道德水平。\r\n"
				+ "比如,如果某员工在芬尼的工作中曾经有过污点,例如收受回扣,这种事情老板不一定知道,但是一定有员工知道。如果该员工参与竞选,知情的其他员工不但不会投他,还会把他的劣迹告知其他选民,选民之间肯定会传。共同利益的导向会让腐败暴露,最终让公司比较廉洁,这就是民主的力量。\r\n"
				+ "第二因素是经营能力。\r\n"
				+ "如果只是道德水准很高,平常很会做人的候选人也不会被选中,因为最小投资的额度不是500元,而是5万元,不可能因为哥们义气,吃顿饭就妥协了。每个投资人都会很慎重,提前反复去了解情况,相当于尽职调查,因为员工投钱都是为了盈利,不会因为跟你关系好就把钱投给你。\r\n"
				+ "最后决赛的结果是第一名拿到了几乎所有的员工投资,第二名只有一点点,第三名一分钱也没有拿到。\r\n"
				+ "常规的比赛通常是前几名比分很接近。但是用钱选人好坏很明显,因为是投资真金白银,只能投一个人,所以必须孤注一掷,最后选出来的一定就是最好的。\r\n"
				+ "润米咨询董事长刘润先生把芬尼举办的创业大赛比作美国的民主选举。跟个人利益的深度绑定,会使投票人更加谨慎地对待自己的选票,最后选出的人一定是最具有创业能力的人。\r\n"
				+ "本文作者宗毅,选自《裂变式创业》,电子书和干货版正在“得到”APP独家首发,可在安卓和苹果应用商店搜索“得到”下载。\r\n"
				+ "逻辑思维:钱是最聪明的东西哲学家霍弗说过一句话——\r\n" + "“商业很有可能腐蚀它接触的一切。\r\n"
				+ "它腐蚀政治、体育、文学、艺术、工会等等。\r\n" + "但商业也同样腐蚀和削弱独裁的极权主义。\r\n"
				+ "资本主义在非资本主义环境中更能发挥其解放的作用。”\r\n" + "回到企业转型的话题——\r\n"
				+ "之所以转型难,不是商业模式问题,而是权力架构问题。\r\n" + "宗毅的实验,最有价值的部分也即在此——\r\n"
				+ "让聪明的钱来瓦解企业内原本顽固的权力结构。\r\n" + "宗毅把他的全部经验都写到了这本《裂变式创业》里。\r\n"
				+ "在“得到”APP下载电子版。";
		String textb = "前几天,和朋友一起去电影院看电影。\r\n"
				+ "\r\n"
				+ "离电影开场还有四十多分钟的时间,朋友突然想起来有东西忘带,便又回去拿东西。我一个人无聊地坐在等候厅里玩手机,坐在对面桌的是一位西装革履,举止优雅的男士。后来又来了一对小情侣坐到我旁边,看样子他们应该刚大学毕业不久,已参加工作。\r\n"
				+ "\r\n"
				+ "一开始他们并没有引起我过多的关注,后来就被他们的说话声吵到抬起头。当时那个女生盘坐在男生的腿上,嚷嚷着要吃哈根达斯,要买恒大冰泉,最后两个人一起去买了一元一瓶的矿泉水。本以为他们会就此消停,没想到他们玩闹的越来越厉害,整个等候厅里都是他们的声音。我又抬头看了看对面的男士,他恰好也抬起头来看我,我们默契地用眼神表达了无奈,之后那位男士又对我从容一笑。过了几分钟我实在忍无可忍那对小情侣的吵闹,干脆就起身坐到了那位男士那桌,他依旧抬头对我从容一笑,然后戴上耳机,继续浏览手机上的内容,自始至终他都没有抱怨和流露出一丝不满。当时被他的举动感染,我也戴上耳机,世界瞬间清净。\r\n"
				+ "\r\n"
				+ "说来也巧,我把这件事情讲给了我的闺蜜听,闺密第二天去参加表哥的婚礼,回来以后告诉我,当时那位男士就是他表哥。也因此知道了他表哥毕业于北京大学,如今在北京的一家大型外企工作,这次回老家来是为了结婚。\r\n"
				+ "\r\n"
				+ "二\r\n"
				+ "\r\n"
				+ "接下来的这个故事,是大学里的一位朋友讲给我听的。\r\n"
				+ "\r\n"
				+ "她宿舍的人都很节俭,从一开学她们就养成了一个习惯,把喝光的但商业也同样矿泉水瓶和不用的纸箱子都攒起来,最后卖给收废品的人,卖的钱用来当舍费。\r\n"
				+ "\r\n"
				+ "某一次临近暑假的时候,她们宿舍已经攒了一阳台的废品,联系到了收废品的人,她和两个舍友就一起把废品装起来,抬下去卖。收废品的人是一位老奶奶,满头白发,衣着简朴,弓着背,一看就知道生活很艰辛。老奶奶跟她们讲好价,她的两个舍友却不依不饶,一定要让老奶奶提高价钱。当时是中午,太阳最毒的时候,老奶奶的额头上早已冒了很多汗。朋友当时一句话也没有说。事后她告诉我,她那两个舍友对待老奶奶的态度像对待狗一样,只是为几毛钱,真的有点过分了。在宿舍里,一直没看出来她们是这样的人。\r\n"
				+ "\r\n"
				+ "三\r\n"
				+ "\r\n"
				+ "高二时候的英语老师,是个五大三粗的男人,经常打农村的学生。他的口头禅是:你一个农村的学生,不好好学习,你来上学干什么,快回家种地吧。城市的孩子犯了错,他会轻轻敲一下他们的头,笑着告诉他们要用心学习,农村的孩子犯了错,轻则大骂一顿,整个教学楼里都回荡着“你一个农村的孩子”诸如此类的话,重则拳打脚踢。可笑的是,大家都知道,他也是个农村人。\r\n"
				+ "\r\n"
				+ "有次他讲课,讲到兴奋处,突然问一个成绩不是很好的女生G,你在班里最好的朋友是谁,她说是Z,英语老师竟然说了一句,Z学习那么好,她怎么会把你当好朋友呢。当时全班沉默,Z恰好是我的同桌,我很清楚的听到Z说了一句,Teacher,you are wrong。事后G和Z依旧每天都玩的很开心,但G再也没有叫他一声老师。\r\n"
				+ "\r\n"
				+ "从小父母就教育我们,对待他人要礼貌,上述三个故事里的每个主人公对待他人都是礼貌的,但懂礼貌并不等于好教养。对待同事彬彬有礼的上班族,可能对餐礼厅里的服务员破口大骂;教育学生礼、忠、孝的老师,也可能会在课堂对学生拳打脚踢,嘲笑怒骂。有时候我们自己都不曾察觉到的一言一行,早已把我们的教养暴露的淋漓尽致。\r\n"
				+ "有人说,要想提高教养,应该多读书。可是,教养一定与读书有关吗?读一千本言情小说的人,不一定会对餐厅里上菜的服务员说一句“谢谢”;从上小学就开始背《三字经》的我们,也未必都是教养很高的人。\r\n"
				+ "\r\n"
				+ "有一位外国的朋友曾经对我说:你看过很多书,在书里经历过各种各样的人生,但哪一个才是你自己的人生?我认为,教养也是这么一回事。我们看到书上讲古人如何举止得体,言谈文明,我们未必接着就去学习古人。但如果我们亲自去街上发一次传单,下次遇到别人给我们传单时,我们一定不会像以前那样粗鲁地拒绝。\r\n"
				+ "\r\n"
				+ "知乎上有个提问:陌生人的哪些事,让你感触很深?有人回答:有一次,地铁里,打翻牛奶,结果洒到了别人身上,赶紧的赔不是,可是旁边的男士却拿出纸巾把我身上的牛奶擦干净,微笑表示不介意,没有一句斥责,很快就下车了。我突然想明白,一个人只有被温柔的对待过,才知道怎样温柔的对待别人,有的人凶悍,也许是因为他不曾被人温柔相待。人总是在一次次经历中反思,然后一步步成熟,尝过被偷的滋味,就选择不去偷窃他人的东西,尝过被朋友恶语中伤的滋味,就选择绝不去恶语中伤朋友,发现说脏话很low,就选择同人交流时使用文明语言,做为公司新人被公司老人欺负,就选择当自己成为公司老人时绝不欺负新来的人,尝过被人温柔以待,就选择以后也温柔以待他人……你的经历给你反思,反思后你的选择决定你成为怎样的人,成为怎样的人决定你有怎样的教养。单纯的读书,并不能给你带来多高的教养,因为理论终是要联系实际的,这也就是为什么很多人读了很多书以后依旧脏话连篇。\r\n"
				+ "\r\n"
				+ "读万卷书虽好,但不如扎根于实际,多样的经历可以使你理解不同阶层群众的生活,内心也就变得慈悲起来,不需要刻意去表现自己的举止,你平日的一言一行都是反映你教养的名片。\r\n"
				+ "\r\n" + " 推荐拓展阅读";
		String aArray[] = texta.split(",");
		String bArray[] = textb.split(",");
		// 将长文断成多个短句 短句之间再进行比较 将基数大大减小
		System.out.println("a:" + Arrays.asList(aArray) + " \nb:"
				+ Arrays.asList(bArray));
		int longest = 0;
		boolean matchAll = true;
		List<String> result = new ArrayList<String>();
		long currentTime = System.currentTimeMillis();
		int minCompareL = 2;// 用于比较的最短的词语长度
		int proceed = 0;
		for (int a = 0; a < aArray.length; a++) {
			if ((a * 100) / aArray.length > proceed) {
				// 方便查看进度
				proceed = (a * 100) / aArray.length;
				System.out.println("length:" + aArray.length + " a:" + a
						+ " process:" + proceed + "%");
			}
			for (int b = 0; b < bArray.length; b++) {
				String aaa_ = aArray[a].replaceAll("。", "").replaceAll("\\r\\n", "");
				String bbb_ = bArray[b].replaceAll("。", "").replaceAll("\\r\\n", "");
				if (aaa_.length() < minCompareL)
					continue;
				for (int i = minCompareL; i < aaa_.length(); i++) {
					// 最外层循环是用来遍历可以比较的长度的
					// 这种算法i只是拿来做长度的参考 就是每次要比较的长度
					// 先遍历的是String aaa
					// 所以当String aaa的长度 大于 Stringbbb的时候 就没有比较的必要了

					boolean toBreak = false;
					if (i >= bbb_.length())
						// 比如A长度为5 B长度为3 那么长度4的A肯定是匹配不到B的
						break;
					if (!matchAll) {
						// 是否匹配所有
						if (longest >= i)
							// 只要已经匹配到了 那么相同长度的公共子串就不匹配了
							continue;
					}
					for (int z = 0; z < aaa_.length(); z++) {
						// z是用来遍历A的
						int aaStart = z;
						int bbStart = 0;
						if (toBreak && matchAll)
							// 如果只是要获取两个字符串中最长公共子串的长度的话 这样会提高一点效率
							// 只要已经获取到i长度的公共子串了 那么相同长度的其他子串就不用比较了
							// 如果是要获取所有最长的公共子串的话 那么只要获取到最长子串的长度后
							// 再循环一次去获取所有该长度的公共子串就可以了
							break;
						while (aaStart + i <= aaa_.length()
								&& bbStart + i <= bbb_.length()) {
							// 该层循环是用来遍历B的
							String tAAA = aaa_.substring(aaStart, aaStart + i);
							String tBBB = bbb_.substring(bbStart, bbStart + i);
							if (tAAA.equals(tBBB)) {
								result.add(tAAA);
								if (i > longest)
									longest = i;
								toBreak = true;
								break;
							}
							bbStart++;
						}
					}
				}
			}

		}

		System.out.println(System.currentTimeMillis() - currentTime + ":"
				+ longest + ":" + result);


输出结果:1253:6:[也就是, 但商业也, 商业也同, 业也同样, 但商业也同, 商业也同样, 但商业也同样]
加入了可配置的 匹配度 以及是否要匹配全部的变量
菜鸟勿喷~~有更高明的方法请赐教

0

主题

0

帖子

-14

安币

初级码农

Rank: 1

发表于 2015-12-30 18:47:54 | 显示全部楼层
不错哦 喜欢 嘿嘿

0

主题

0

帖子

-16

安币

限制会员

发表于 2015-12-30 22:32:31 | 显示全部楼层
看帖子的要发表下看法

0

主题

0

帖子

-6

安币

限制会员

发表于 2015-12-31 05:00:26 | 显示全部楼层
学习了!!!!

0

主题

0

帖子

-20

安币

初级码农

Rank: 1

发表于 2015-12-31 11:28:20 | 显示全部楼层
不错哦 喜欢 嘿嘿

659

主题

2140

帖子

7480

安币

码皇(巴士元老)

Rank: 8Rank: 8

发表于 2015-12-31 12:47:12 | 显示全部楼层
前来支持~~~~~~~~~~~~~~~~~~~

0

主题

0

帖子

-9

安币

限制会员

发表于 2015-12-31 14:06:03 | 显示全部楼层
看帖子的要发表下看法

0

主题

0

帖子

-6

安币

限制会员

发表于 2015-12-31 18:49:02 | 显示全部楼层
不错!顶LZ
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

领先的中文移动开发者社区
18620764416
7*24全天服务
意见反馈:1294855032@qq.com

扫一扫关注我们

Powered by Discuz! X3.2© 2001-2019 Comsenz Inc.( 粤ICP备15117877号 )