森林举行运动会,小伙伴们身上每个都印着一个字符标记,排成一列,委员会要挑出每列里相邻小伙伴身上没有重复字符标记的,最多能挑出几个?
比如:小伙伴们的字符标记串起来是“ccccccbc” 那相邻的小伙伴身上没有重复的字符标记是cb或者bc,那这个人数就是2。
比如:小伙伴们的字符标记串起来是“ccccccbc” 那相邻的小伙伴身上没有重复的字符标记是cb或者bc,那这个人数就是2。
这题的意思是要记录一个字符串中,无重复子字符串的长度的最大值。案例中cb的长度是2,bc的长度也是2所以返回值是2.
要立即对题目的意思再开始做题!!!
此处,用一个map<>存储字符串中<字符,最近一次出现位置>,通过
curStart变量记录最近一个无重复字符串的起始位置。
解答:
public static int lengthOfLongestSubstring(String s) {
Map<Character, Integer> index = new HashMap<>(); // 存放字符最近一次出现的位置
int curStart = 0, curLen = 0, maxLen = 0;
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i); // 添加字符c到一个已有的无重复字符子串结尾
if (index.containsKey(c) && index.get(c) >= curStart) { // 字符c已经在这个无重复字符子串中
curStart = index.get(c) + 1; // 更新当前无重复字符子串的起点
}
curLen = i - curStart + 1; // 当前无重复字符子串的长度
if (curLen > maxLen) {
maxLen = curLen;
}
index.put(c, i);
}
return maxLen;
}
Map<Character, Integer> index = new HashMap<>(); // 存放字符最近一次出现的位置
int curStart = 0, curLen = 0, maxLen = 0;
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i); // 添加字符c到一个已有的无重复字符子串结尾
if (index.containsKey(c) && index.get(c) >= curStart) { // 字符c已经在这个无重复字符子串中
curStart = index.get(c) + 1; // 更新当前无重复字符子串的起点
}
curLen = i - curStart + 1; // 当前无重复字符子串的长度
if (curLen > maxLen) {
maxLen = curLen;
}
index.put(c, i);
}
return maxLen;
}