要哭了,用穷举法写最长公共子序列

问题描述

网上都是动态规划。。但我要穷举法啊在键盘上输入三个字符串,然后输出最长公共子序列。。。【输入输出样例】输入:cecqbhvaiaedpibalukcabegviapcihlaaugckadceevfdadaepcialaukd输出:Cevapiluk都想到淘宝上买了。。。可是没有一个店家理我。。。救我。。。。。

解决方案

解决方案二:
你知道查下线段树算法。网上应该有现成的。
解决方案三:
穷举法是暴力法吗?这个运行起来够吃力啊。这是我写的暴力法。/**Tochangethislicenseheader,chooseLicenseHeadersinProjectProperties.*Tochangethistemplatefile,chooseTools|Templates*andopenthetemplateintheeditor.*/packagetest;importjava.util.ArrayList;importjava.util.List;/****@authorAdministrator*/publicclassSubString{/***@paramargsthecommandlinearguments*/staticbooleanisIn(Stringsub,StringIn){returnIn.contains(sub);}staticString[]getSubs(StringIn){char[]ins=In.toCharArray();intinL=(int)Math.pow(2,In.length());String[]asubs=newString[inL-1];Stringpositions;StringaSub;for(inti=1;i<inL;i++){positions=Integer.toBinaryString(i);if(positions.length()<ins.length){do{positions="0"+positions;}while(positions.length()<ins.length);}char[]aCs=positions.toCharArray();List<Character>aSubChars=newArrayList<Character>();for(intj=0;j<aCs.length;j++){if(Character.digit(aCs[j],10)==1){aSubChars.add(ins[j]);}}aSub=aSubChars.toString();asubs[i-1]=aSub;}returnasubs;}publicstaticvoidmain(String[]args){Stringa="dvsrwwwyui";Stringb="dvsrwwtyu";Stringc="dpseerwytiu";Stringmax=null;intmaxlength=0;String[]asubs=getSubs(a);String[]bsubs=getSubs(b);String[]csubs=getSubs(c);for(inti=0;i<asubs.length;i++){for(intj=0;j<bsubs.length;j++){for(intk=0;k<csubs.length;k++){if(asubs[i].equals(bsubs[j])&&asubs[i].equals(csubs[k])){if(csubs[k].length()>maxlength){maxlength=csubs[k].length();max=csubs[k];}}}}}if(max!=null){max=max.replace("[","").replace("]","").replace(",","").replace("","");}System.out.println(a);System.out.println(b);System.out.println(c);System.out.println("结果:"+max);}}

dvsrwwwyuidvsrwwtyudpseerwytiu结果:dsrwyu
解决方案四:
抽屉原理,字母26个,每个字符串放入26个数组,最后被放了三次的就存在最长公共子序列
解决方案五:
本来不抱希望的。。。居然有人些了代码引用2楼skyhitnow的回复:

穷举法是暴力法吗?这个运行起来够吃力啊。这是我写的暴力法。/**Tochangethislicenseheader,chooseLicenseHeadersinProjectProperties.*Tochangethistemplatefile,chooseTools|Templates*andopenthetemplateintheeditor.*/packagetest;importjava.util.ArrayList;importjava.util.List;/****@authorAdministrator*/publicclassSubString{/***@paramargsthecommandlinearguments*/staticbooleanisIn(Stringsub,StringIn){returnIn.contains(sub);}staticString[]getSubs(StringIn){char[]ins=In.toCharArray();intinL=(int)Math.pow(2,In.length());String[]asubs=newString[inL-1];Stringpositions;StringaSub;for(inti=1;i<inL;i++){positions=Integer.toBinaryString(i);if(positions.length()<ins.length){do{positions="0"+positions;}while(positions.length()<ins.length);}char[]aCs=positions.toCharArray();List<Character>aSubChars=newArrayList<Character>();for(intj=0;j<aCs.length;j++){if(Character.digit(aCs[j],10)==1){aSubChars.add(ins[j]);}}aSub=aSubChars.toString();asubs[i-1]=aSub;}returnasubs;}publicstaticvoidmain(String[]args){Stringa="dvsrwwwyui";Stringb="dvsrwwtyu";Stringc="dpseerwytiu";Stringmax=null;intmaxlength=0;String[]asubs=getSubs(a);String[]bsubs=getSubs(b);String[]csubs=getSubs(c);for(inti=0;i<asubs.length;i++){for(intj=0;j<bsubs.length;j++){for(intk=0;k<csubs.length;k++){if(asubs[i].equals(bsubs[j])&&asubs[i].equals(csubs[k])){if(csubs[k].length()>maxlength){maxlength=csubs[k].length();max=csubs[k];}}}}}if(max!=null){max=max.replace("[","").replace("]","").replace(",","").replace("","");}System.out.println(a);System.out.println(b);System.out.println(c);System.out.println("结果:"+max);}}

dvsrwwwyuidvsrwwtyudpseerwytiu结果:dsrwyu

谢谢大神!!!本来不抱希望的55555555非常感谢
解决方案六:
为了防止被老师查到我得删除了
解决方案七:
引用4楼wushuangzhen的回复:

本来不抱希望的。。。居然有人些了代码Quote: 引用2楼skyhitnow的回复:
穷举法是暴力法吗?这个运行起来够吃力啊。这是我写的暴力法。/**Tochangethislicenseheader,chooseLicenseHeadersinProjectProperties.*Tochangethistemplatefile,chooseTools|Templates*andopenthetemplateintheeditor.*/packagetest;importjava.util.ArrayList;importjava.util.List;/****@authorAdministrator*/publicclassSubString{/***@paramargsthecommandlinearguments*/staticbooleanisIn(Stringsub,StringIn){returnIn.contains(sub);}staticString[]getSubs(StringIn){char[]ins=In.toCharArray();intinL=(int)Math.pow(2,In.length());String[]asubs=newString[inL-1];Stringpositions;StringaSub;for(inti=1;i<inL;i++){positions=Integer.toBinaryString(i);if(positions.length()<ins.length){do{positions="0"+positions;}while(positions.length()<ins.length);}char[]aCs=positions.toCharArray();List<Character>aSubChars=newArrayList<Character>();for(intj=0;j<aCs.length;j++){if(Character.digit(aCs[j],10)==1){aSubChars.add(ins[j]);}}aSub=aSubChars.toString();asubs[i-1]=aSub;}returnasubs;}publicstaticvoidmain(String[]args){Stringa="dvsrwwwyui";Stringb="dvsrwwtyu";Stringc="dpseerwytiu";Stringmax=null;intmaxlength=0;String[]asubs=getSubs(a);String[]bsubs=getSubs(b);String[]csubs=getSubs(c);for(inti=0;i<asubs.length;i++){for(intj=0;j<bsubs.length;j++){for(intk=0;k<csubs.length;k++){if(asubs[i].equals(bsubs[j])&&asubs[i].equals(csubs[k])){if(csubs[k].length()>maxlength){maxlength=csubs[k].length();max=csubs[k];}}}}}if(max!=null){max=max.replace("[","").replace("]","").replace(",","").replace("","");}System.out.println(a);System.out.println(b);System.out.println(c);System.out.println("结果:"+max);}}

dvsrwwwyuidvsrwwtyudpseerwytiu结果:dsrwyu

谢谢大神!!!本来不抱希望的55555555非常感谢

这段代码需要改进,改进交给你了。不要将三个字符串的所有子串都穷举出来,穷举一个就可以了,然后查看每个子串是否在其他两个串中。否则,算法复杂度是:O(2^(3*n)
解决方案八:
简单描述一下算法吧。找到三个个字符串的全部子序列,然后一一比较,这是上面的实现。找字符串子序列的算法:比如对于字符串avbcds,它的长度是7,那么它的子序列数量是2^7-1,对于其中每一个字母,要么选,要么不选,只有两种选择,所以7位,可能的组合就是2^7,减一是减去一种特殊情况,那就是全部不选的情况。怎么遍历呢?对于每一位做一个标记,选的话标为1,不选的话标为0,那么全不选表示为0000000,全选表示为1111111,因为全不选我们是不要的,所以,从0000001开始,这个数字表示的是只有s的串,因为只有最后一位是1,怎么从0000001到1111111全部遍历呢?其实这就是从1-2^7-1的遍历,把每个数字转成二进制就是上述的形式。显然,这些二进制数字都是不同的,而且全部遍历到了,那么,对应的字符串子串也全部穷举了。其实没必要三个子串都遍历,只要把第一个遍历后,在其他两个中查找有无就好了,过程中记下最长的输出来。这样,可以大幅度地降低算法复杂度,减少运行时间。

时间: 2024-09-22 22:07:43

要哭了,用穷举法写最长公共子序列的相关文章

穷举法破解密码-MPI+VC6.0进行两台PC的并行计算,穷举法破解6-12位的密码(字母和数字组合)的MPI程序

问题描述 MPI+VC6.0进行两台PC的并行计算,穷举法破解6-12位的密码(字母和数字组合)的MPI程序 10C 需要分配任务,任务不知道怎么分配,我打算写控制台程序,先提示输入密码,用"*"显示,然后破解密码,显示密码是什么.怎么写这个程序啊,谢谢各位大神了.我在网上找了好多资料,可是估计是因为编程能力太差,实在写不出来啊.求大家帮帮忙,比较着急这个,谢谢 解决方案 我搭建好了MPI运行环境,只是遇到编程就傻了,实在编不出来,能给出程序吗?本身编程能力比较差,现在马上要交毕业设计

C++实践参考解答 穷举法解决组合问题

[项目:穷举法解决组合问题](自选两题完成,其他的想一想即可.当然,全做完收效更好)先阅读例题,领会穷举法(意为"穷尽式列举",也称枚举)的思想,然后自行选题进行解决,掌握这种程序设计的一般方法. 例题:小明有五本新书,要借给A,B,C三位小朋友,若每人每次只能借一本,则可以有多少种不同的借法? 问题分析与算法设计:本问题实际上是一个排列问题,即求从5个中取3个进行排列的方法的总数.首先对五本书从1至5进行编号,然后使用穷举的方法.假设三个人分别借这五本书中的一本,当三个人所借的书的编

穷举法解24点游戏

24点游戏: 输入:n1,n2,n3,n4 输出:若能通过+ - * / 和括号混合运算,得到运算结果为24,则输出一个对应的运算表达式 穷举法: 对4个数字全排列有4!=24种排列. 4个数字共需要3个运算符,同一个运算符可以重复出现,则有4x4x4=64种情况. 对于4个数字而言,共有以下5中加括号的方式: (A(B(CD))),(A((BC)D)),((AB)(CD)),((A(BC))D),(((AB)C)D). 所以遍历的表达式最多有24*64*5=7680种.即使采用逆波兰表达式,总

用穷举法找出1到100的质数并显示出来

用穷举法找出1到100的质数并显示出来.分别使用while.do-while.for循环语句实现. 1.用while: include<iostream.h> void main() {int i,j,n,m; i=2; while(i<101) {m=1;n=i/2;j=2; while(j<=n) { if(i%j==0) {m=0; breake; } j++; } if(m) cout<<i<<""; i++; } } 2.用do

算法系列(十六) 使用穷举法解猜结果游戏

一. 引言 穷举是解决问题的一种常用思路,当对一个问题无从下手的时候,可以考虑在问题 域允许的范围内将所有可能的结果穷举出来,然后根据正确结果的判断规则对这些结果逐个验证,从而找 出正确的结果.采用穷举的方法求解问题的答案比较适合计算机做,对这种体力活它们没有怨言,本文就 以常见的两个猜结果的题目为例,介绍一下如何通过计算机程序解决此类问题,顺便介绍一下穷举法常见 的算法结构和实现方式. 二. 猜结果游戏的分析过程 先来看一个问题,有五个运动员 (甲.乙.丙.丁.戊)参加运动会,分别获得了一百米

《C语言及程序设计》实践项目——穷举法解题

返回:贺老师课程教学链接 说明:穷举法在有些时候,并不是一种最有效率的解决方案,但却是最直观的.初学者依靠这一组问题的解决,将获得程序设计的最直接体验,以及会想问题的头脑. [项目1-小明借书]小明有五本新书,要借给A,B,C三位小朋友,若每人每次只能借一本,则可以有多少种不同的借法?提示:本问题实际上是一个排列问题,即求从5个中取3个进行排列的方法的总数.首先对五本书从1至5进行编号,然后使用穷举的方法.假设三个人分别借这五本书中的一本,当三个人所借的书的编号都不相同时,就是满足题意的一种借阅

C++基本算法思想之穷举法_C 语言

穷举算法(Exhaustive Attack method)是最简单的一种算法,其依赖于计算机的强大计算能力来穷尽每一种可能性,从而达到求解问题的目的.穷举算法效率不高,但是适应于一些没有规律可循的场合. 穷举算法基本思想穷举算法的基本思想就是从所有可能的情况中搜索正确的答案,其执行步骤如下: (1)对于一种可能的情况,计算其结果. (2)判断结果是否符合要求,如果不满足则执行第(1)步来搜索下一个可能的情况:如果符合要求,则表示寻找到一个正确答案. 在使用穷举法时,需要明确问题的答案的范围,这

C语言及程序设计初步例程-40 穷举法解题

贺老师教学链接  C语言及程序设计初步 本课讲解 穷举法求解:百鸡百钱问题:鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一.百钱买百鸡,问鸡翁.鸡母.鸡雏各几何? #include <stdio.h> int main() { int x,y,z; //定义数据类型为整型,买鸡和买烤鸡不是一个概念 for(x=0; x<=20; ++x) for(y=0; y<=33; ++y) //穷举中.... for(z=0; z<=100; ++z) if(5*x+3*y+z/3==100

求三个数的最小公倍数,实际是穷举法

//求三个数的最小公倍数,实际是穷举法 #include<stdio.h> int main() { int i=0; int a,b,c; long x; printf("Input a b c:"); scanf("%d%d%d",&a,&b,&c); if(a>b) a^=b^=a^=b; if(b>c) b^=c^=b^=c;//此时c>b>a do { i++; x=c*i; }while((x%