题目
给定一个字符串 s
,请你找出其中不含有重复字符的 最长子串 的长度。
示例1: 输入: s = "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。 示例2: 输入: s = "bbbbb" 输出: 1 解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。 示例3: 输入: s = "pwwkew" 输出: 3 解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。 请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
这道题用到滑动窗口解法,
滑动窗口多应用于求解数组、字符串中的最大子串问题。
滑动窗口思路如下:
1.在字符串s中使用双指针的左右指针技巧,初始化left = right = 0,把索引闭区间[left,right]称为一个窗口。
2.然后根据条件不断扩大窗口的right边界。直到窗口的字符串符合要求(包含了所有字符)
3.此时,停止增加right边界,转而增加left指针从而缩小窗口,直到窗口中的字符串不再符合要求。同时每次增加left时候,都要更新一轮结果。
4.重复第二步和第三步,直到right到达字符串的尽头。
多谢leetcode大佬K1nesis的题解启发。
class Solution {
public int lengthOfLongestSubstring(String s) {
if(s.length()<=1){
return s.length();
}
int left = 0;
int max = 1;
char n[] = s.toCharArray();
for(int i =1;i<n.length;i++) {
for(int j = left;j<i;j++) {
if(n[i] == n[j]) {
left =j+1;
break;
}
}
max = max > (i-left+1)? max: (i-left+1);
}
return max;
}
}
思路:
如果字符串的长度小于等于1,直接返回数组长度即可。
如果字符串长度大于1,定好左右区间,将字符串变为char型数组接收起来。遍历char数组,先将i定为right区间。j为left区间,每次判断当前i,j的数是否相等,不相等的话,就赋给max值。然后继续比较,若相等,将left区间在j的基础上加1。说明前面最长的已经比对过。区间缩短。然后重复,直到读取到s末尾。