某度一面题目:处理一个给定字符串,输出满足以下条件:
- 该字符串是原字符串的子串
- 该字符串不包含重复字符
- 满足上述条件的最长子串
第一遍没听明白,以为写三个小程序,第二遍听明白了,但代码不熟练写不粗来,解释了一下方法(时刻谨记万能的哈希),过关~。
归来实现如下 :
1 public static String longestSubString(String str) { 2 char[] schars = str.toCharArray(); 3 int len = schars.length; 4 // 保存最长子串 5 String maxSubString = ""; 6 // 临时保存可能的最长子串 7 String tempMax = ""; 8 // hashmap存储不重复的字符 9 Map<Character, Integer> charMap = new LinkedHashMap<Character, Integer>(); 10 // 一层for遍历每个字符 11 for (int i = 0; i < len; i++) { 12 // 将map置空 13 charMap.clear(); 14 tempMax = ""; 15 // 二层for遍历该字符开始的子串中是否有重复字符 16 for (int j = i; j < len; j++) { 17 // 不包含的话加入到hashmap和tempMax中 18 if (!charMap.containsKey(schars[j])) { 19 charMap.put(schars[j], 1); 20 tempMax += schars[j]; 21 } else { 22 // 包含的话跳出二层for 23 break; 24 } 25 } 26 // 重置最长的子串 27 if (tempMax.length() > maxSubString.length()) { 28 maxSubString = tempMax; 29 } 30 31 } 32 return maxSubString; 33 34 }
万恶的dhp提问:如果有多个子串都符合要求肿么办,你都能输出来么?
不能~
修改~
把结果存在一个list里输出
1 public static ArrayList<String> longestSubString(String str) { 2 char[] schars = str.toCharArray(); 3 int len = schars.length; 4 // 保存最长子串的list 5 ArrayList<String> maxSubString = new ArrayList<String>(); 6 maxSubString.add(""); 7 // 临时保存最长子串 8 String tempMax = ""; 9 // hashmap存储不重复的字符 10 Map<Character, Integer> charMap = new LinkedHashMap<Character, Integer>(); 11 // 一层for遍历每个字符 12 for (int i = 0; i < len; i++) { 13 // 将map置空 14 charMap.clear(); 15 tempMax = ""; 16 // 二层for遍历该字符开始的子串中是否有重复字符 17 for (int j = i; j < len; j++) { 18 // 不包含的话加入到hashmap和tempMax中 19 if (!charMap.containsKey(schars[j])) { 20 charMap.put(schars[j], 1); 21 tempMax += schars[j]; 22 } else { 23 //包含的话跳出二层for 24 break; 25 } 26 } 27 //重置最长的子串 28 if (tempMax.length() > maxSubString.get(0).toString().length()) { 29 // 当前子串最长,则清空max中元素,再存储当前子串 30 maxSubString.clear(); 31 maxSubString.add(tempMax); 32 } else if (tempMax.length() == maxSubString.get(0).toString() 33 .length()) { 34 // 当前子串与之前子串等长,则add该子串 35 maxSubString.add(tempMax); 36 } 37 38 } 39 return maxSubString; 40 41 }