要求找出一個字符串中不包含重複字符的字串的最大長度,例如:
abcab中的abc和cab滿足條件,長度爲3
abcaabcd中的abcd,長度爲4
輸入:一個字符串
輸出:不包含重複字符的字串的最大長度
思路:
現將該字符串轉換爲字符數組,順序遍歷每個字符,看前面符合規則的子串(下標範圍[begin, index-1])中是否包含該字符,如果不包括則將該字符加入子串;如果包含,記錄與該字符相同的字符下標爲m,則新的符合規則的子串的下標範圍爲[m+1, index],更新begin爲m+1
上圖爲,遍歷每個字符時,當前的不包含重複字符的子串
代碼如下:
public class Class1 {
public static void main(String[] args) {
String str = "abcaabcd";
Class1 c1 = new Class1();
int len = c1.findMaxSubLen(str);
System.out.println("len: "+len);
}
/**
* 找到字符串中,不包含重複字符的最大字串長度
* @param str String類型
* @return 不包含重複字符的最大子串的長度
*/
private int findMaxSubLen(String str) {
//這裏也可以判斷是不是String對象
if(str==null)
return 0;
int strLen = str.length();
if(strLen<=1)
return strLen;
//一般情況
char[] chs = str.toCharArray();
int begin = 0;
int result = 1;
int tmp = 1;
for(int i = 1; i<strLen; i++) {
int index = findChar(chs, begin, i-1, chs[i]);
//如果i之前的不重複子串中沒有與chs[i]相同的字符
if(index==-1) {
tmp++;
}else {//如果有
result = Math.max(result, tmp);
begin = index+1;
tmp = i-index;
}
result = Math.max(result, tmp);
//System.out.println("--tmp--: "+tmp);
}
return result;
}
/**
* 在char型數組chs中,從[begin, end]中找到第一個與字符ch相同的字符的下標
* @param chs char型數組
* @param begin 尋找的起點
* @param end 尋找的截止
* @param ch 尋找的字符
* @return int 找到的第一個與字符ch相同的字符的下標,如果沒有找到則返回-1
*/
private int findChar(char[] chs, int begin, int end, char ch) {
if(chs==null || begin<0 || begin>end)
return -1;
for(int i = begin; i<=end; i++) {
if(chs[i]==ch) {
return i;
}
}
return -1;
}
}