题目如下所示:
基本思路为:
先构建一个字符串ans,值为s的第一个字符。对传入的字符串s,从第二个开始,取出其中的每一个字符,用for循环对ans中的值与该字符进行判断,若ans中不含有,则填入ans;含有则意味着要改变ans,具体改变为删除ans所含有该字符的前面部分,这样才可以填入后面部分,可以理解为滑动窗口。
用一个int类型的变量max表示最大长度,初始值为0,每当要删除ans的一部分时,意味着ans为目前所遍历到的s中一个不重复的子串,用max与当前ans的长度进行比较,取较大值。
当s都遍历完后,所得的ans不一定是最大长度子串,还要与max进行比较,具体代码如下:
public class Solution {
public int LengthOfLongestSubstring(string s) {
if(s.Length==0)return 0;
int max=0;
string ans;
ans=s.Substring(0,1);
for(int i=1;i<s.Length;i++){
string c=s.Substring(i,1);
if (ans.Contains(c)){
max=max>ans.Length?max:ans.Length;
ans=ans.Remove(0,ans.IndexOf(c)+1);
ans=string. Concat(ans,c);
}else{
ans=string. Concat(ans,c);
}
}
max=max>ans.Length?max:ans.Length;
return max;
}
}
这种遍历时间复杂度为O(n),效率较低
看了题解后,发现还可以用哈希集合,时间复杂度为O(1)。