思路一:先找出一個字元串中所有子串,再找出所有子串中最長的那一個; 思路二:每次找出的子串長度都比上一次的子串長,則最後的子串即是最長子串的長度數。 我選擇的是第二種方法。 ...
思路一:先找出一個字元串中所有子串,再找出所有子串中最長的那一個;
思路二:每次找出的子串長度都比上一次的子串長,則最後的子串即是最長子串的長度數。
我選擇的是第二種方法。
public class FindSubstringMaxlengthNoduplicate {
public static void main(String[] args) {
String s = "adcdghcwioizhfksjdyuiodfhjskhgkhgeisdcjdkh";
ArrayList<String> result = findMaxLength(s);
int maxLength = result.get(result.size()-1).length();
System.out.println("最長不重覆子串為:");
for(String r : result){
if(r.length() == maxLength){
System.out.println(r);
}
}
}
private static ArrayList<String> findMaxLength(String s) {
int maxLength = 0;
HashSet<Character> hs = null;
ArrayList<String> list = new ArrayList<String>();
for(int j = 0; j < s.length(); ++j){
int count = 0;
hs = new HashSet<Character>();
for(int i = j; i < s.length(); ++i){
if(hs.add(s.charAt(i))){
++count;
if(count == s.length()-j){
if(count >= maxLength){
maxLength = count;
list.add(s.substring(j,i));
}
j = s.length();
}
}else{
if(count >= maxLength){
maxLength = count;
list.add(s.substring(j,i));
}
int numOfDupllicate = 0;
for(int k = j; k < i; ++k){
if(s.charAt(i) != s.charAt(k)){
++numOfDupllicate;
}else{
break;
}
}
j = j+numOfDupllicate;
break;
}
}
}
return list;
}
}