给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是"abc",所以其
长度为 3。示例 2:
输入: "bbbbb" 输出: 1 解释: 因为无重复字符的最长子串是"b"
,所以其长度为 1。示例 3:
输入: "pwwkew" 输出: 3 解释: 因为无重复字符的最长子串是"wke"
,所以其长度为 3。 请注意,你的答案必须是 子串 的长度,"pwke"
是一个子序列,不是子串。
太菜了 这道题想不出来想用set做 最后一直有不符合情况的例子 后来找了个评论区答案提交了一下查看了第一名的代码 真的很强
public int lengthOfLongestSubstring(String s) {
int ans = 0;
int[] vis = new int[256];
int len = s.length();//字符串长度
int left = -1;
Arrays.fill(vis,-1);//将vis每个值设置为-1
for(int i = 0; i < len; i++) {
int m = s.charAt(i);
if(vis[m] > left) {//这里取的是字符串的ascll码 如果该码对应的位置有已经被赋值了
left = vis[s.charAt(i)]; //将同位置有值的ascall码给left
}//当读到该位置发现不是-1说明之前有存在 这时 value是其之前在字符串上的第几位 这时left被赋值为之前的第几位
ans = Math.max(ans,i - left);//然后用i(现在的位数)减去left(之前该字符的位数)就是他们之间的位数了
vis[s.charAt(i)] = i;//每次将该位置是第几个字符存入该位置
}
return ans;
}
该方法是定义一个数组作为标记,如果没有相同的字符则i-left相当于加1 如果有相同的情况下 i和left刚好是两个重复字符在字符串中的位置,i-left就是两个字符中间不重复字符的长度。
不管重复不重复。遍历一个字符时都会将该字符在字符串中的位置赋值给vis中该字符ascall码对应的数字的位置上,这时如果有相同的便会发现该位置有值了,则这时就会计算他们的间隔长度。如果大于之前的就会替换记录最大值的字符
使用数组标记其字符串位置用法,之前没有接触过。一定记住该方法。