华为机试题-----查找一个字符串的子字符串集

时间:2021-11-23 18:48:25

一、问题描述

 功能描述:查找一个字符串的子字符串集  输入:abab 输出:a b ab ba aba bab

二、算法分析

/**
	 * Gets the all the substring from input data string
	 * @param data
	 * @return
	 */
	public List<String> getChildren(String data) {
		List<String> list = new ArrayList<String>();
		char[] arr = data.toCharArray();
		int count = 1;
		while (count < data.length()) {
			for (int i = 0; i <= arr.length - count; i++) {
				if (count == 1) {
					if (!list.contains(String.valueOf(arr[i]))) {
						list.add(String.valueOf(arr[i]));
					}
				} else if (count == 2) {
					char[] temp = { arr[i], arr[i + 1] };
					if (!list.contains(String.valueOf(temp))) {
						list.add(String.valueOf(temp));
					}
				} else if (count == 3) {
					char[] temp = { arr[i], arr[i + 1], arr[i + 2] };
					if (!list.contains(String.valueOf(temp))) {
						list.add(String.valueOf(temp));
					}
				}

			}
			count++;
		}

		for (int i = 0; i < list.size(); i++) {
			System.out.print(list.get(i) + " ");
		}
		System.out.println("-----------");
		return list;
	}

算法二、(来自网友)


/**
	 * Gets from online 
	 * @param str
	 * @return
	 */
	public Set<String> getChildren1(String str) {

		Set<String> data = new TreeSet<String>();
		int len = str.length();
		for (int i = 1; i < len; i++) {
			for (int j = 0; j < str.length(); j++) {
				String tmp = str.substring(j);
				while (tmp.length() >= i) {
					data.add(tmp.substring(0, i));
					tmp = tmp.substring(i);
				}
			}
		}
		for (String key : data) {
			System.out.print(key + " ");
		}
		return data;
	}
三、测试

	public static void main(String[] args) {
		Main19 m = new Main19();
		m.getChildren("abab");
		m.getChildren1("abab");
	}

测试结果:

a b ab ba aba bab -----------
a ab aba b ba bab 

感悟:看来网友的算法,发现更加高明,其一,利用set保证了所用的子串是唯一的,其三,利用动态二重循环保证了从1个到n-1个所有子串和substring方法。其三、更具有适用性,个人的仅仅适用于字符串长度为四。