中等
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串的长度。
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
提示:
0 <= s.length <= 5 * 104s由英文字母、数字、符号和空格组成
public class T4 {
public int lengthOfLongestSubstring(String s) {
if(s.length() == 0)
{
return 0;
}
int ans = 0;
int max = 0;
StringBuilder sb = new StringBuilder();
for (int i = 0; i < s.length(); i++) {
if (sb.indexOf(s.charAt(i) + "") == -1) {
sb.append(s.charAt(i));
max++;
} else {
sb.append(s.charAt(i));
sb.delete(0, sb.indexOf(s.charAt(i)+"")+1);
if (max > ans)
ans = max;
max = sb.length();
}
if (i == s.length() - 1 && max > ans) {
ans = max;
}
}
return ans;
}
public static void main(String[] args) {
System.out.println(new T4().lengthOfLongestSubstring("pwwkew"));
}
}代码解答过程解释
初始化变量:
初始化
ans和max为 0,用于记录最长子串的长度。创建一个
StringBuilder对象sb,用于存储当前遍历过的字符。
遍历字符串:
使用
for循环遍历字符串s中的每个字符。
判断字符是否重复:
判断当前字符是否在
sb中已经存在,如果不存在,则将该字符添加到sb中,并增加max的值。如果字符已经存在于
sb中,说明出现了重复字符,此时需要更新max的值,并将sb中重复字符及其之前的字符删除,保留从重复字符之后的字符。
更新最长子串长度:
每次遇到重复字符时,都需要判断当前的
max是否大于之前记录的ans,如果是则更新ans的值为当前的max。在循环结束时,再次判断一次
max是否大于ans,如果是则更新ans的值为当前的max。
返回结果:
返回最终计算得到的
ans,即不含重复字符的最长子串的长度。
这段代码的主要思路是通过遍历字符串,使用 StringBuilder 来动态存储当前的子串,并实时更新最长子串的长度。当遇到重复字符时,通过删除重复字符及其之前的字符,保留从重复字符之后的字符,来实现寻找不含重复字符的最长子串。
Comments