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

gungun9184 2013-07-10 12:42:36
例如:
输入:abab 返回:true 输入:abcd 返回:false
...全文
277 9 打赏 收藏 转发到动态 举报
写回复
用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个字符。

50,549

社区成员

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

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