这是最近一次编程面试中提出的问题。
给定一个随机字符串S和另一个只包含唯一元素的字符串T,找到S中包含T所有元素的最小连续子串。例如,
S='adobecodebanc'
T='abc'
Answer='banc'
我想出了一个解决方案,
public static String completeSubstring(String T, String S){
String minSub = T;
StringBuilder sb = new StringBuilder();
for (int i = 0; i <T.length()-1; i++) {
for (int j = i + 1; j <= T.length() ; j++) {
String sub = T.substring(i,j);
if(stringContains(sub, S)){
if(sub.length() < minSub.length()) minSub = sub;
}
}
}
return minSub;
}
private static boolean stringContains(String t, String s){
//if(t.length() <= s.length()) return false;
int[] arr = new int[256];
for (int i = 0; i <t.length() ; i++) {
char c = t.charAt(i);
arr[c -'a'] = 1;
}
boolean found = true;
for (int i = 0; i <s.length() ; i++) {
char c = s.charAt(i);
if(arr[c - 'a'] != 1){
found = false;
break;
}else continue;
}
return found;
}
这个算法的时间复杂度为O(n3),显然并不理想。有没有人能提供更好的算法呢?
band
? - Zeus