要求找出一个字符串中不包含重复字符的字串的最大长度,例如:
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;
}
}