题目描述:
给定一个字符串,找到最长子字符串的长度而不重复字符。
例如,没有重复 “abcabcbb” 字母的最长子字符串是 “abc”,其长度为3.
对于 “bbbbb”,最长的子字符串是 “b”,长度为 1。
解题思路:
- 题目很好理解,就是求给定字符串的最大字串长度
- 这里大致的思想就是求滑动窗口的最大值
- 使用一个 sbString 存储当前窗口的字符串
- 取出原始数组中的每一个字符,看看其是否出现在 sbString 中
- 若没有出现,将 sbString 字符串扩充,若出现,则截取 sbString 串,成为新的 sbString
- 在操作的过程中不断的更替最大字串 res 的长度
代码如下:
public int lengthOfLongestSubstring(String s) {
if (s.length() < 1 || s == null) return 0;
int maxlen = 1;
int res = 1;
String sbString = String.valueOf(s.charAt(0));
for (int i = 1; i < s.length(); i++) {
char temp = s.charAt(i);
// 判断当前字符是否出现在 sbString 中
int j = 0;
while (j < sbString.length()) {
if (temp == sbString.charAt(j)) {
break;
}
j++;
}
// 若不在 sbString 中,将其添加到 sbString 的末尾,并更新当前字符串的长度和 res 的长度
if( j >= sbString.length()){
sbString += temp;
maxlen++;
res = Math.max(maxlen,res);
}
else
{
// 若出现在 sbString 中,则重新选定 sbString,以及它的长度
sbString = sbString.substring(j + 1,sbString.length()) + temp;
res = Math.max(maxlen,res);
maxlen = sbString.length();
}
}
return res;
}