问题描述
如何高效的找出一个字符串中最长重复次数的字符串,并计算其重复次数。例如:字符串“abcfghibcklabcdlkmabcdefg”,将返回“abcd”和2
解决方案
解决方案二:
[b]追加一个问题:给你一个随机生成a到b的函数randomA()和randomB(),用它去实现一个随机生成c到d的函数randomCD()
解决方案三:
第一题:Strings="字符串";for(intr=0;r<s.length()-1;r++){for(inti=r+1;i<=s.length();i++){if(i<=s.length()){Stringdd=s.substring(r,i);if(s.indexOf(dd)!=-1){Stringtmps=s.replaceAll(dd,"");intlen=(s.length()-tmps.length())/dd.length();if(len>1){//只有大于一次的才记录System.out.println(dd+"重复出现的次数:"+len);}}}}
解决方案四:
如果是求最大,可以将得到的重复字符串,存在一个数组里面,然后进行排序,求出最大值
解决方案五:
第二题没看懂
解决方案六:
你给的那个例子结果应该是abc,3吧
解决方案七:
引用5楼sca4441479的回复:
你给的那个例子结果应该是abc,3吧
abcd是最长重复的
解决方案八:
字符串的问题如何解决,取决于你有多大数据量,如果说数据量很小,这个问题那就太简单了,split一下,然后搞个Map保存并且每次加1就行了。如果数据量很大的话,这个问题就比较复杂了。
解决方案九:
引用2楼shijing266的回复:
第一题:Strings="字符串";for(intr=0;r<s.length()-1;r++){for(inti=r+1;i<=s.length();i++){if(i<=s.length()){Stringdd=s.substring(r,i);if(s.indexOf(dd)!=-1){Stringtmps=s.replaceAll(dd,"");intlen=(s.length()-tmps.length())/dd.length();if(len>1){//只有大于一次的才记录System.out.println(dd+"重复出现的次数:"+len);}}}}
好强
解决方案十:
引用2楼shijing266的回复:
第一题:Strings="字符串";for(intr=0;r<s.length()-1;r++){for(inti=r+1;i<=s.length();i++){if(i<=s.length()){Stringdd=s.substring(r,i);if(s.indexOf(dd)!=-1){Stringtmps=s.replaceAll(dd,"");intlen=(s.length()-tmps.length())/dd.length();if(len>1){//只有大于一次的才记录System.out.println(dd+"重复出现的次数:"+len);}}}}
第一个if是不是很多余啊?
解决方案十一:
引用9楼u012742909的回复:
Quote: 引用2楼shijing266的回复:
第一题:Strings="字符串";for(intr=0;r<s.length()-1;r++){for(inti=r+1;i<=s.length();i++){if(i<=s.length()){Stringdd=s.substring(r,i);if(s.indexOf(dd)!=-1){Stringtmps=s.replaceAll(dd,"");intlen=(s.length()-tmps.length())/dd.length();if(len>1){//只有大于一次的才记录System.out.println(dd+"重复出现的次数:"+len);}}}}第一个if是不是很多余啊?
呵呵~随你理解~
解决方案十二:
publicclassTest{publicstaticvoidmain(String[]args){while(true){BufferedReaderbr=newBufferedReader(newInputStreamReader(System.in));System.out.println("请输入你要查找的字符串,如要结束请键入END:");Strings="";try{s=br.readLine();if(s.equals("END")||s.equals("end")){System.out.println("退出程序");System.exit(0);}for(intr=0;r<s.length()-1;r++){for(inti=r+1;i<=s.length();i++){if(i<=s.length()){Stringdd=s.substring(r,i);if(s.indexOf(dd)!=-1){Stringtmps=s.replaceAll(dd,"");intlen=(s.length()-tmps.length())/dd.length();if(len>1){//只有大于一次的才记录System.out.println(dd+"重复出现的次数:"+len);}}}}}}catch(IOExceptione){System.out.println("程序出错:"+e.getMessage());}}}}
解决方案十三:
引用1楼u012842647的回复:
[b]追加一个问题:给你一个随机生成a到b的函数randomA()和randomB(),用它去实现一个随机生成c到d的函数randomCD()
楼主是“已知一个随机生成a到b的函数randomAB(),用它去实现一个随机生成c到d的函数randomCD()”这个意思嘛?
解决方案十四:
引用7楼rumlee的回复:
字符串的问题如何解决,取决于你有多大数据量,如果说数据量很小,这个问题那就太简单了,split一下,然后搞个Map保存并且每次加1就行了。如果数据量很大的话,这个问题就比较复杂了。
可是这个不是根据空格切割的呀,应该怎样切割?
解决方案十五:
第一个题,有好多种情况,再次不能按空格切割,因为空格也是字符。我给出一个算法,目前涵盖了我能想到的所有情况。最不好想的一种是这个输入:abcdefabcmodef上代码:importjava.util.ArrayList;/***<p>Title:TestString</p>*<p>Description:输入字符串,最长重复次数的字符串,并计算其重复次数。空格也当字符处理</p>*@params*@authorZhengBing(2014-8-21下午4:12:17)*/publicclassTestString{publicstaticvoidmain(String[]args){//Strings="abcabdabcmpoer";//结果为:重复字符串:abc,重复次数:2//Strings="abcdefabcmodef";//结果为:重复字符串:abc,重复次数:2//重复字符串:def,重复次数:2Strings="abcdyyyyopqrstabcdiiiiabcdoooopqrst";//结果为:重复字符串:opqrst,重复次数:2ArrayList<String>subStrings=newArrayList<String>();intcount=0;for(inti=0;i<s.length();i++){for(intj=i+1;j<=s.length();j++){Stringsub=s.substring(i,j);intc=(s.length()-s.replaceAll(sub,"").length())/sub.length();if(subStrings.size()==0){if(c>1){subStrings.add(sub);count=c;}}else{if(sub.length()>subStrings.get(0).length()&&c>1){subStrings.clear();subStrings.add(sub);count=c;}elseif(sub.length()==subStrings.get(0).length()&&c==count){if(!subStrings.contains(sub))subStrings.add(sub);}}if(j-i-1>=s.length()/2)break;}}if(subStrings.size()==0){System.out.println("未找到重复字符串。");}else{for(inti=0;i<subStrings.size();i++){System.out.println("重复字符串:"+subStrings.get(i)+",重复次数:"+count);}}}}
解决方案:
引用2楼shijing266的回复:
第一题:Strings="字符串";for(intr=0;r<s.length()-1;r++){for(inti=r+1;i<=s.length();i++){if(i<=s.length()){Stringdd=s.substring(r,i);if(s.indexOf(dd)!=-1){Stringtmps=s.replaceAll(dd,"");intlen=(s.length()-tmps.length())/dd.length();if(len>1){//只有大于一次的才记录System.out.println(dd+"重复出现的次数:"+len);}}}}
二楼,你写的,输入abcdefabcmodef会是什么结果。
解决方案:
第二题,麻烦你把题说明白,我没看懂
解决方案:
引用15楼innight的回复:
Quote: 引用2楼shijing266的回复:
第一题:Strings="字符串";for(intr=0;r<s.length()-1;r++){for(inti=r+1;i<=s.length();i++){if(i<=s.length()){Stringdd=s.substring(r,i);if(s.indexOf(dd)!=-1){Stringtmps=s.replaceAll(dd,"");intlen=(s.length()-tmps.length())/dd.length();if(len>1){//只有大于一次的才记录System.out.println(dd+"重复出现的次数:"+len);}}}}二楼,你写的,输入abcdefabcmodef会是什么结果。
abc重复出现的次数:2b重复出现的次数:2bc重复出现的次数:2c重复出现的次数:2d重复出现的次数:2de重复出现的次数:2def重复出现的次数:2e重复出现的次数:2ef重复出现的次数:2
解决方案:
引用17楼shijing266的回复:
Quote: 引用15楼innight的回复:
Quote: 引用2楼shijing266的回复:
第一题:Strings="字符串";for(intr=0;r<s.length()-1;r++){for(inti=r+1;i<=s.length();i++){if(i<=s.length()){Stringdd=s.substring(r,i);if(s.indexOf(dd)!=-1){Stringtmps=s.replaceAll(dd,"");intlen=(s.length()-tmps.length())/dd.length();if(len>1){//只有大于一次的才记录System.out.println(dd+"重复出现的次数:"+len);}}}}二楼,你写的,输入abcdefabcmodef会是什么结果。
abc重复出现的次数:2b重复出现的次数:2bc重复出现的次数:2c重复出现的次数:2d重复出现的次数:2de重复出现的次数:2def重复出现的次数:2e重复出现的次数:2ef重复出现的次数:2
你这程序只能算是完成了一半内层循环没必要循环到i<=s.length(),一半就可以了,比如:if(i-r-1>=s.length()/2)break;
解决方案:
凑个热闹publicstaticvoidmain(String[]args){finalStringchaine="abcfghibcklabcdlkmabcdefg";String[]arr=chaine.split("");Arrays.sort(arr,newComparator<String>(){@Overridepublicintcompare(Stringo1,Stringo2){if(o1.length()!=o2.length()){returno1.length()<o2.length()?-1:1;}returno1.compareTo(o2);}});StringtheStr=arr[arr.length-1];IntegertheSum=1;for(inti=arr.length-2;i>=0;i--){StringcurrentStr=arr[i];IntegercurrentSum=1;for(intj=i+1;j<arr.length;j++){if(arr[j].contains(currentStr))currentSum++;}if(currentSum>1){theStr=currentStr;theSum=currentSum;if(i==0||arr[i-1].length()<currentStr.length())break;}}System.out.println(theStr+":"+theSum);}
解决方案:
引用18楼innight的回复:
Quote: 引用17楼shijing266的回复:
Quote: 引用15楼innight的回复:
Quote: 引用2楼shijing266的回复:
第一题:Strings="字符串";for(intr=0;r<s.length()-1;r++){for(inti=r+1;i<=s.length();i++){if(i<=s.length()){Stringdd=s.substring(r,i);if(s.indexOf(dd)!=-1){Stringtmps=s.replaceAll(dd,"");intlen=(s.length()-tmps.length())/dd.length();if(len>1){//只有大于一次的才记录System.out.println(dd+"重复出现的次数:"+len);}}}}二楼,你写的,输入abcdefabcmodef会是什么结果。
abc重复出现的次数:2b重复出现的次数:2bc重复出现的次数:2c重复出现的次数:2d重复出现的次数:2de重复出现的次数:2def重复出现的次数:2e重复出现的次数:2ef重复出现的次数:2
你这程序只能算是完成了一半内层循环没必要循环到i<=s.length(),一半就可以了,比如:if(i-r-1>=s.length()/2)break;
恩,我之前没考虑那么多...因为只要是字符就循环出来了