题目描述:
给定一个字符串 s
,请你找出其中不含有重复字符的 最长子串的长度。
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc"
,所以其长度为 3。
示例 2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b"
,所以其长度为 1。
示例 3:
输入: s = "pwwkew" 输出: 3 解释: 因为无重复字符的最长子串是"wke"
,所以其长度为 3。 请注意,你的答案必须是 子串 的长度,"pwke"
是一个子序列,不是子串。
提示:
0 <= s.length <= 5 * 104
s
由英文字母、数字、符号和空格组成
题解:
滑动窗口的思想:
从左到右遍历每一个位置的字符,temp中保存的是当前计算出来的最长无重复字符的子串,count中保存的是无重复元素的最长字串长度。
初始时,在temp字符串中保存第一个字符,假设现在从第二个字符位置开始遍历,如果当前位置的字符 x 在temp中已有记录,那么说明现在以第一个字符开头的子串已经是最长的无重复元素的子串了,那么就更新count,然后从temp中找出字符 x 出现的位置,然后从该位置之后截取字符串,重新更新字符串temp,接着将下一个要添加进来的字符拼接在字符串末尾,继续向后遍历下一个字符。
代码实现:
class Solution {
public int lengthOfLongestSubstring(String s) {
if(s.length()==0){
return 0;
}
if(s.length()==1){
return 1;
}
char[] a = s.toCharArray();
int count = 0;
int len = s.length();
StringBuffer temp = new StringBuffer(String.valueOf(a[0]));
for (int i = 1; i < len; i++) {
int index = temp.indexOf(String.valueOf(a[i]));
if(index!=-1) {
count = Math.max(count, temp.length());
temp.delete(0, index + 1);
}
temp.append(a[i]);
count = Math.max(count,temp.length());
}
return count;
}
}
知识点:
StringBuffer可以delete、append、indexOf但是不可以contains
标签:子串,字符,temp,int,count,力扣,length,字串 From: https://blog.csdn.net/qq_62622854/article/details/139158695