java中判断一个字符串是否含有子字符串(子字符串长度>=2)

gungun9184 2013-07-10 12:42:36
例如:
输入:abab 返回:true 输入:abcd 返回:false
...全文
281 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Inhibitory 2013-07-10
  • 打赏
  • 举报
回复
1. 先分离出所有子串 2. 查找每一个子串:KMP算法
花木兰1闪21A 2013-07-10
  • 打赏
  • 举报
回复
上一个效率太低,换一个:

public static void main(String[] arg) {
		String str = "ertyertyabcdabcdsdf464132132146464165479lhkjhnkjgibkjbjljdslfsajdlasdf4asdf5a7e";
		int count = 2;
		List<String> maxLengthList = new ArrayList<String>();
		maxLengthList = fetchMaxLeString(str, count, maxLengthList);
		System.out.println(maxLengthList);
		StringBuilder sbBuilder = new StringBuilder();
		if (maxLengthList.isEmpty()) {
			System.out.println("无重复并且长度大于2的子串!");
		} else {
			int maxLength = maxLengthList.get(0).length();
			sbBuilder.append(maxLengthList.get(0)).append(",");
			for (int i = 1; i < maxLengthList.size(); i++) {
				if (maxLengthList.get(i).length() == maxLength) {
					sbBuilder.append(maxLengthList.get(i)).append(",");
				}
			}
			System.out.println("重复最长子串为:"
					+ sbBuilder.toString().substring(0,
							sbBuilder.toString().length() - 1));
		}
	}

	public static List<String> fetchMaxLeString(String str, int count,
			List<String> maxLengthList) {
		if (count > str.length() / 2 + 1) {
			return maxLengthList;
		}
		for (int i = 0; i < str.length() - count; i++) {
			List<String> strList = new ArrayList<String>();
			String regex = str.substring(i, i + count) + "+?";
			Pattern pattern = Pattern.compile(regex);
			Matcher matcher = pattern.matcher(str);
			while (matcher.find()) {
				strList.add(matcher.group());
			}
			if (strList.size() > 1
					&& !maxLengthList.contains(str.substring(i, i + count))) {
				maxLengthList.add(str.substring(i, i + count));
			}
		}
		count++;
		if (count > str.length()) {
			return maxLengthList;
		}
		fetchMaxLeString(str, count, maxLengthList);
		Collections.sort(maxLengthList, new Comparator<Object>() {
			@Override
			public int compare(Object o1, Object o2) {
				int length1 = o1.toString().length();
				int length2 = o2.toString().length();
				return length1 - length2 < 0 ? 1 : (length1 - length2 == 0 ? o1
						.toString().compareTo(o2.toString()) : -1);
			}
		});
		return maxLengthList;
	}
花木兰1闪21A 2013-07-10
  • 打赏
  • 举报
回复
附上求最长重复子串的代码,若是求真假 直接看返回的maxLengthList是不是空就行了

public static void main(String[] arg) throws ParseException {
		String str = "abcdabcdsdf";
		int startindex = 0;
		int count = 2;
		List<String> maxLengthList = new ArrayList<String>();
		maxLengthList = fetchMaxLeString(str.substring(0, count), str,startindex, count, maxLengthList);
		System.out.println(maxLengthList);
		StringBuilder sbBuilder = new StringBuilder();
		if (maxLengthList.isEmpty()) {
			System.out.println("无重复并且长度大于2的子串!");
		} else {
			int maxLength = maxLengthList.get(0).length();
			sbBuilder.append(maxLengthList.get(0)).append(",");
			for (int i = 1; i < maxLengthList.size(); i++) {
				if (maxLengthList.get(i).length() == maxLength) {
					sbBuilder.append(maxLengthList.get(i)).append(",");
				}
			}
			System.out.println("重复最长子串为:"+ sbBuilder.toString().substring(0,sbBuilder.toString().length() - 1));
		}
	}

	public static List<String> fetchMaxLeString(String str1, String str,
			int startindex, int count, List<String> maxLengthList) {
		startindex++;
		if (count > str.length() / 2 + 1) {
			return maxLengthList;
		}
		List<String> strList = new ArrayList<String>();
		String regex = str1 + "+?";
		Pattern pattern = Pattern.compile(regex);
		Matcher matcher = pattern.matcher(str);
		while (matcher.find()) {
			strList.add(matcher.group());
		}
		if (strList.size() > 1 && !maxLengthList.contains(str1)) {
			maxLengthList.add(str1);
		}
		int endIndex = startindex + count;
		if (endIndex > str.length()) {
			return maxLengthList;
		}
		fetchMaxLeString(str.substring(startindex, endIndex), str, startindex,
				count, maxLengthList);
		count++;
		if (count > str.length()) {
			return maxLengthList;
		}
		fetchMaxLeString(str.substring(0, count), str, startindex, count,
				maxLengthList);
		Collections.sort(maxLengthList, new Comparator<Object>() {
			@Override
			public int compare(Object o1, Object o2) {
				int length1 = o1.toString().length();
				int length2 = o2.toString().length();
				return length1 - length2 < 0 ? 1 : (length1 - length2 == 0 ? o1.toString().compareTo(o2.toString()) : -1);
			}
		});
		return maxLengthList;
	}
lanmenghcc 2013-07-10
  • 打赏
  • 举报
回复
我这个效率不一定高,但是看上去简单。就是取两个字符,然后分别看他们在字符串中第一次出现跟最后一次出现的位置是否一致。如果不一致就说明出现重复
lanmenghcc 2013-07-10
  • 打赏
  • 举报
回复
private static boolean isHasSubString(String str) {
for (int i = 0; i < str.length() -1; i++) {
if(str.indexOf(str.substring(i, i+2)) != str.lastIndexOf(str.substring(i, i+2))){
return true;
}
}
return false;
}
花木兰1闪21A 2013-07-10
  • 打赏
  • 举报
回复

public static void main(String[] arg) throws ParseException {
		String str = "abab";
		int startindex = 0;
		int count = 2;
		System.out.println(isHave(str.substring(0, count), str, startindex,
				count));
	}

	public static boolean isHave(String str1, String str, int startindex,
			int count) {
		boolean isHave = false;
		++startindex;
		if (count > str.length() / 2 + 1) {
			return isHave;
		}
		List<String> strList = new ArrayList<String>();
		String regex = str1 + "+?";
		Pattern pattern = Pattern.compile(regex);
		Matcher matcher = pattern.matcher(str);
		while (matcher.find()) {
			strList.add(matcher.group(0));
		}
		if (strList.size() > 1) {
			isHave = true;
		} else if (!str.endsWith(str1)) {
			int endIndex = startindex + count;
			if (endIndex > str.length()) {
				return isHave;
			}
			isHave = isHave(str.substring(startindex, endIndex), str,
					startindex, count);
		} else {
			++count;
			isHave = isHave(str.substring(0, count), str, startindex, count);
		}
		return isHave;
	}
你这里是要示真假,所以你这长度大于2是没有意义的,大于2的都有的话等于2肯定有的了,这样理解的话我这代码还可以简化,又考虑到可能要求出最长匹配的字符串,所以我就不去了
  • 打赏
  • 举报
回复
最简单的方法。
 String str = "abcdab";
		 // 计算java的个数
		 int length = str.length() - str.replaceAll("ab", "").length();
		 System.out.println(length / 2);//2是ab大小
复杂的方法,java提供了好像有个StringTokenizer类。
失落夏天 2013-07-10
  • 打赏
  • 举报
回复
如果不考虑效率的话,可以用双层for循环解决 String str="abcdeab"; public boolean haveRepeat(String str){ //从第一个字符开始比较 for(int i=0;i<str.length;i++){ //所比较字符串的长度,结束标记为所剩余的字符串一半的长度即可 for(int k=0;k<((str.length-i)/2+1);k++){ String s=str.substring(i,i+k);//获取匹配的字符串。 if(str.contanins(s,i+k+1))return true;//判断从i+k+1个字符之后的字符串中是否包含匹配的字符串。 } } return false; } 纯手工敲的,没用编译工具,所以方法有可能会敲错,但是肯定会有这个方法,有兴趣的可以调试一下。告诉我错误。
oh_Maxy 版主 2013-07-10
  • 打赏
  • 举报
回复
想到一个穷举方法:两个字符比较余下来的字符,出现相同即返回true;没找到就三个字符匹配,一直到n-1个字符。
在Windows 10或Windows 11操作系统,用户经常会遇到共享打印机时出现的一系列错误代码,这些错误代码可能会阻碍打印机共享功能的正常使用。常见的错误代码包括0x00000057、0x00000709和0x0000011b,这些代码通常指出了不同的问题,比如权限不足、服务未运行或配置错误等。除此之外,还有一些故障提示如“连接失败”或“内存不足”,这些都可能影响到打印机共享的稳定性。 要解决这些故障,首先要确保打印机已经正确地连接到网络,并且在需要共享的电脑上进行了设置。确保打印机驱动程序是最新的,并且在共享设置没有错误配置。对于权限问题,需要检查网络上的用户账户是否具有足够的权限来访问共享打印机。同时,也要确保打印机服务正在运行,特别是“Print Spooler”服务,因为这是打印机共享服务的核心组件。 在某些情况下,问题可能与操作系统的更新有关,如升级到最新版的Windows 10或Windows 11后可能出现的兼容性问题。这时,可能需要查看微软的官方支持文档来获取特定的解决方案或更新。 对于错误代码0x00000057,这通常是由于没有足够的权限来访问网络打印机或其共享资源,解决方法是确保网络打印机的权限设置正确,包括在组策略设置相应的访问权限。而0x00000709错误可能是由于打印机驱动问题或打印机端口配置错误,可以尝试重新安装或更新打印机驱动来解决。至于0x0000011b错误,这往往是因为打印机队列服务的问题,检查并重启“Print Spooler”服务通常是解决这类问题的常见手段。 至于“连接失败”或“内存不足”这类故障,通常与客户端和打印机之间的网络连接以及打印机本地资源的使用情况有关。检查网络连接,确保打印机所在的网络段没有故障或断。同时,如果打印机的打印队列长时间得不到处理,可能会导致内存不足的情况,这时可能需要清理打印队列或增加打印机的内存配置。 为了帮助用户更快速地解决这些问题,市面上出现了各种打印机共享错误修复工具。这些工具往往通过预设的修复程序来自动检测和修正打印机共享常见的问题。它们可以快速检查打印机驱动、网络连接以及共享设置,并且能够提供一键修复功能,大幅减少了用户自行排查和解决问题的难度。 然而,在使用这些修复工具之前,用户应确保这些工具的来源是安全可靠的,避免因使用不当的修复工具而引发其他系统安全或隐私问题。用户可以到官方平台或者信誉良好的软件提供商处下载这些工具。通过细心检查打印机的共享设置,及时更新驱动程序和服务,以及合理使用修复工具,大多数共享打印机的问题都可以得到有效的解决。

51,397

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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