一个很容易的难题。

中琦 2014-08-17 02:58:15
如何高效的找出一个字符串中最长重复次数的字符串,并计算其重复次数。

例如:字符串“abc fghi bc kl abcd lkm abcdefg”,将返回“abcd”和2
...全文
433 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 18 楼 innight 的回复:
[quote=引用 17 楼 shijing266 的回复:] [quote=引用 15 楼 innight 的回复:] [quote=引用 2 楼 shijing266 的回复:] 第一题:

String s = "字符串";
for (int r = 0; r < s.length()-1; r++) {
		    for (int i = r + 1; i <= s.length(); i++) {
		        if (i <= s.length()) {
			String dd = s.substring(r, i);
			if (s.indexOf(dd) != -1) {
			    String tmps = s.replaceAll(dd, "");
			    int len=(s.length()-tmps.length())/dd.length();
			    if(len>1){//只有大于一次的才记录
			          System.out.println(dd+"重复出现的次数:"+len);
			    }
								
			}
		      }
		}
二楼,你写的,输入abcdefabcmodef会是什么结果。[/quote] abc重复出现的次数:2 b重复出现的次数:2 bc重复出现的次数:2 c重复出现的次数:2 d重复出现的次数:2 de重复出现的次数:2 def重复出现的次数:2 e重复出现的次数:2 ef重复出现的次数:2 [/quote]你这程序只能算是完成了一半 内层循环没必要循环到 i <= s.length(),一半就可以了,比如:
if (i - r - 1 >= s.length() / 2)break;
[/quote] 恩,我之前没考虑那么多... 因为只要是字符就循环出来了
yktd26 2014-08-21
  • 打赏
  • 举报
回复
凑个热闹
public static void main(String[] args) {
		final String chaine = "abc fghi bc kl abcd lkm abcdefg";
		
		String[] arr = chaine.split(" ");
		
		Arrays.sort(arr, new Comparator<String>() {
			@Override
			public int compare(String o1, String o2) {
				if (o1.length() != o2.length()) {
					return o1.length() < o2.length() ? -1 : 1;
				}
				return o1.compareTo(o2);
			}
			
		});
		
		String theStr = arr[arr.length - 1];
		Integer theSum = 1;
		
		for (int i = arr.length - 2; i >=0; i--) {
			String currentStr = arr[i];
			Integer currentSum = 1;
			for(int j = 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);
	}
innight 2014-08-21
  • 打赏
  • 举报
回复
引用 17 楼 shijing266 的回复:
[quote=引用 15 楼 innight 的回复:] [quote=引用 2 楼 shijing266 的回复:] 第一题:

String s = "字符串";
for (int r = 0; r < s.length()-1; r++) {
		    for (int i = r + 1; i <= s.length(); i++) {
		        if (i <= s.length()) {
			String dd = s.substring(r, i);
			if (s.indexOf(dd) != -1) {
			    String tmps = s.replaceAll(dd, "");
			    int len=(s.length()-tmps.length())/dd.length();
			    if(len>1){//只有大于一次的才记录
			          System.out.println(dd+"重复出现的次数:"+len);
			    }
								
			}
		      }
		}
二楼,你写的,输入abcdefabcmodef会是什么结果。[/quote] abc重复出现的次数:2 b重复出现的次数:2 bc重复出现的次数:2 c重复出现的次数:2 d重复出现的次数:2 de重复出现的次数:2 def重复出现的次数:2 e重复出现的次数:2 ef重复出现的次数:2 [/quote]你这程序只能算是完成了一半 内层循环没必要循环到 i <= s.length(),一半就可以了,比如:
if (i - r - 1 >= s.length() / 2)break;
  • 打赏
  • 举报
回复
引用 15 楼 innight 的回复:
[quote=引用 2 楼 shijing266 的回复:] 第一题:

String s = "字符串";
for (int r = 0; r < s.length()-1; r++) {
		    for (int i = r + 1; i <= s.length(); i++) {
		        if (i <= s.length()) {
			String dd = s.substring(r, i);
			if (s.indexOf(dd) != -1) {
			    String tmps = s.replaceAll(dd, "");
			    int len=(s.length()-tmps.length())/dd.length();
			    if(len>1){//只有大于一次的才记录
			          System.out.println(dd+"重复出现的次数:"+len);
			    }
								
			}
		      }
		}
二楼,你写的,输入abcdefabcmodef会是什么结果。[/quote] abc重复出现的次数:2 b重复出现的次数:2 bc重复出现的次数:2 c重复出现的次数:2 d重复出现的次数:2 de重复出现的次数:2 def重复出现的次数:2 e重复出现的次数:2 ef重复出现的次数:2
innight 2014-08-21
  • 打赏
  • 举报
回复
第二题,麻烦你把题说明白,我没看懂
innight 2014-08-21
  • 打赏
  • 举报
回复
引用 2 楼 shijing266 的回复:
第一题:

String s = "字符串";
for (int r = 0; r < s.length()-1; r++) {
		    for (int i = r + 1; i <= s.length(); i++) {
		        if (i <= s.length()) {
			String dd = s.substring(r, i);
			if (s.indexOf(dd) != -1) {
			    String tmps = s.replaceAll(dd, "");
			    int len=(s.length()-tmps.length())/dd.length();
			    if(len>1){//只有大于一次的才记录
			          System.out.println(dd+"重复出现的次数:"+len);
			    }
								
			}
		      }
		}
二楼,你写的,输入abcdefabcmodef会是什么结果。
innight 2014-08-21
  • 打赏
  • 举报
回复
第一个题,有好多种情况,再次不能按空格切割,因为空格也是字符。我给出一个算法,目前涵盖了我能想到的所有情况。 最不好想的一种是这个输入:abcdefabcmodef 上代码:
import java.util.ArrayList;

/**
 * <p>Title: TestString</p>
 * <p>Description: 输入字符串,最长重复次数的字符串,并计算其重复次数。空格也当字符处理</p>
 * @params
 * @author ZhengBing (2014-8-21 下午4:12:17)
 */
public class TestString {

	public static void main(String[] args) {
		
		//String s = "abcabdabcmpoer";//结果为:重复字符串:abc,重复次数:2
		
		//String s = "abcdefabcmodef";//结果为:重复字符串:abc,重复次数:2
									  		  //重复字符串:def,重复次数:2
		
		String s = "abcdyyyyopqrstabcdiiiiabcdoooopqrst";//结果为:重复字符串:opqrst,重复次数:2
		ArrayList<String> subStrings = new ArrayList<String>();
		int count = 0;
		for (int i = 0; i < s.length(); i++) {
			for (int j = i + 1; j <= s.length(); j++) {
				String sub = s.substring(i, j);
				int c = (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;
					} else if (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 (int i = 0; i < subStrings.size(); i++) {
				System.out.println("重复字符串:" + subStrings.get(i) + ",重复次数:" + count);
			}
		}
	}
}
紫米黑米 2014-08-20
  • 打赏
  • 举报
回复
引用 7 楼 rumlee 的回复:
字符串的问题如何解决,取决于你有多大数据量,如果说数据量很小,这个问题那就太简单了,split一下,然后搞个Map保存并且每次加1就行了。 如果数据量很大的话,这个问题就比较复杂了。
可是这个不是根据空格切割的呀,应该怎样切割?
ghx287524027 2014-08-20
  • 打赏
  • 举报
回复
引用 1 楼 u012842647 的回复:
[b]追加一个问题:给你一个随机生成a到b的函数randomA()和randomB(), 用它去实现一个随机生成c到d的函数randomCD()
楼主是“已知一个随机生成a到b的函数randomAB(), 用它去实现一个随机生成c到d的函数randomCD()”这个意思嘛?
ghx287524027 2014-08-20
  • 打赏
  • 举报
回复
public class Test { public static void main(String[] args) { while (true) { BufferedReader br = new BufferedReader( new InputStreamReader(System.in)); System.out.println("请输入你要查找的字符串,如要结束请键入END:"); String s = ""; try { s = br.readLine(); if (s.equals("END") || s.equals("end")) { System.out.println("退出程序"); System.exit(0); } for (int r = 0; r < s.length()-1; r++) { for (int i = r + 1; i <= s.length(); i++) { if (i <= s.length()) { String dd = s.substring(r, i); if (s.indexOf(dd) != -1) { String tmps = s.replaceAll(dd, ""); int len=(s.length()-tmps.length())/dd.length(); if(len>1){//只有大于一次的才记录 System.out.println(dd+"重复出现的次数:"+len); } } } } } } catch (IOException e) { System.out.println("程序出错:" + e.getMessage()); } } } }
  • 打赏
  • 举报
回复
引用 9 楼 u012742909 的回复:
[quote=引用 2 楼 shijing266 的回复:] 第一题:

String s = "字符串";
for (int r = 0; r < s.length()-1; r++) {
		    for (int i = r + 1; i <= s.length(); i++) {
		        if (i <= s.length()) {
			String dd = s.substring(r, i);
			if (s.indexOf(dd) != -1) {
			    String tmps = s.replaceAll(dd, "");
			    int len=(s.length()-tmps.length())/dd.length();
			    if(len>1){//只有大于一次的才记录
			          System.out.println(dd+"重复出现的次数:"+len);
			    }
								
			}
		      }
		}
第一个if是不是很多余啊?[/quote] 呵呵~ 随你理解~
紫米黑米 2014-08-19
  • 打赏
  • 举报
回复
引用 2 楼 shijing266 的回复:
第一题:

String s = "字符串";
for (int r = 0; r < s.length()-1; r++) {
		    for (int i = r + 1; i <= s.length(); i++) {
		        if (i <= s.length()) {
			String dd = s.substring(r, i);
			if (s.indexOf(dd) != -1) {
			    String tmps = s.replaceAll(dd, "");
			    int len=(s.length()-tmps.length())/dd.length();
			    if(len>1){//只有大于一次的才记录
			          System.out.println(dd+"重复出现的次数:"+len);
			    }
								
			}
		      }
		}
第一个if是不是很多余啊?
Golden_Dog 2014-08-18
  • 打赏
  • 举报
回复
引用 2 楼 shijing266 的回复:
第一题:

String s = "字符串";
for (int r = 0; r < s.length()-1; r++) {
		    for (int i = r + 1; i <= s.length(); i++) {
		        if (i <= s.length()) {
			String dd = s.substring(r, i);
			if (s.indexOf(dd) != -1) {
			    String tmps = s.replaceAll(dd, "");
			    int len=(s.length()-tmps.length())/dd.length();
			    if(len>1){//只有大于一次的才记录
			          System.out.println(dd+"重复出现的次数:"+len);
			    }
								
			}
		      }
		}
好强
rumlee 2014-08-18
  • 打赏
  • 举报
回复
字符串的问题如何解决,取决于你有多大数据量,如果说数据量很小,这个问题那就太简单了,split一下,然后搞个Map保存并且每次加1就行了。 如果数据量很大的话,这个问题就比较复杂了。
醉欲眠卿且去 2014-08-18
  • 打赏
  • 举报
回复
引用 5 楼 sca4441479 的回复:
你给的那个例子 结果应该是abc,3吧
abcd是最长重复的
sca4441479 2014-08-18
  • 打赏
  • 举报
回复
你给的那个例子 结果应该是abc,3吧
  • 打赏
  • 举报
回复
第二题没看懂
  • 打赏
  • 举报
回复
如果是求最大,可以将得到的重复字符串,存在一个数组里面,然后进行排序,求出最大值
  • 打赏
  • 举报
回复
第一题:

String s = "字符串";
for (int r = 0; r < s.length()-1; r++) {
		    for (int i = r + 1; i <= s.length(); i++) {
		        if (i <= s.length()) {
			String dd = s.substring(r, i);
			if (s.indexOf(dd) != -1) {
			    String tmps = s.replaceAll(dd, "");
			    int len=(s.length()-tmps.length())/dd.length();
			    if(len>1){//只有大于一次的才记录
			          System.out.println(dd+"重复出现的次数:"+len);
			    }
								
			}
		      }
		}
中琦 2014-08-17
  • 打赏
  • 举报
回复
[b]追加一个问题:给你一个随机生成a到b的函数randomA()和randomB(), 用它去实现一个随机生成c到d的函数randomCD()

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧