输出最长的不含重复字符的子串

某度一面题目:处理一个给定字符串,输出满足以下条件:

  • 该字符串是原字符串的子串
  • 该字符串不包含重复字符
  • 满足上述条件的最长子串

第一遍没听明白,以为写三个小程序,第二遍听明白了,但代码不熟练写不粗来,解释了一下方法(时刻谨记万能的哈希),过关~。

归来实现如下

 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 }

 

 

posted @ 2012-11-12 18:34  恋霓裳  阅读(551)  评论(0编辑  收藏  举报