求字符串的最长子字符串(字符不重复)

题目

  • 要求
    求输入字符串的字符不重复的子字符串集合
    首尾两个字符可重复
    如果有多个结果长度相同,都输出(内容也相同的算一个)
  • 样例
    样例输入:adsasadmasd
    样例输出:[dmasd]

工具方法

import java.util.Set;
import java.util.LinkedHashSet;

// 获取一条字符串的最长子字符串的集合(满足字符不相同,首尾可相同)
class GetSubString {

	// 获取字符串line的最长子字符串(须满足字符不重复)的集合
	public static Set getNotRepeatSubstring(String line) {
		Set set = new LinkedHashSet<>();	// 按添加顺序组织集合内元素
		int len = line.length();
		for (int i = len; i > 1; i--) {
			for (int j = 0; j < len - i + 1; j++) {
				String subString = line.substring(j, j + i);
				if (notRepeat(subString)) {
					set.add(subString);
				}
			}
			if (set.size() > 0) {
				break;	// 若收到最长不重复子字符串,中断循环。
			}
		}
		return set;
	}

	// 判断str是否为字符不重复的字符串
	private static boolean notRepeat(String str) {
		String[] arr = str.split("");	// 对任何字符通用。所以不用str.toCharArray()
		int len = arr.length;
		Set set = new LinkedHashSet<>(len);
		for (String e : arr) {
			set.add(e);
		}
		int size = set.size();
		boolean flag1 = (size == len);	// str的所有字符都不重复
		boolean flag2 = (size == len - 1 && arr[0].equals(arr[len - 1]));	// 首尾字符重复
		return (flag1 || flag2) ? true : false;
	}

}

测试

public static void main(String[] args) {
	System.out.println(GetSubString.getNotRepeatSubstring("aaaaa"));
	System.out.println(GetSubString.getNotRepeatSubstring("zxcvb"));
	System.out.println(GetSubString.getNotRepeatSubstring("adsasadmasd"));
	System.out.println(GetSubString.getNotRepeatSubstring("abcabc"));
}

输出

[aa]
[zxcvb]
[dmasd]
[abca, bcab, cabc]

你可能感兴趣的:(Java)