当前位置 博文首页 > Sunny-Shi的博客:Leetcode无重复字符的最长子串 C语言
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例 2:
输入: “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
示例 3:
输入: “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters
sn数组记录每个字符在字符串中出现的位置(值为坐标i+1)
cur为当前检索的字符串的首字符的位置
len当前检索的没有重复字符串的长度
max没有重复字符的最大长度
当所检测的字符没有出现过sn[s[i]]==0或者不在当前检测的字符串的范围内时sn[s[i]]<cur
更新sn的值,并且长度增加,索引i增加
否则,出现重复的字符,更新max的值,记录最长字符串的长度,修改当前检索的字符串的首字符的位置(即重复字符之前出现的位置sn[s[i]]的值),修改当前检索的字符串的长度(i-cur+1),继续检索下一个字符
时间复杂度O(n)
```c
int lengthOfLongestSubstring(char * s){
int max=0,i=0,cur=0,length,len=0;
length=strlen(s);
if(length<=1) return length;
int sn[256]={0};
while(s[i]!=NULL){
if(sn[s[i]]==0||sn[s[i]]<cur){
sn[s[i]]=i+1;
len++;
i++;
}
else{
max=max>len?max:len;
cur=sn[s[i]];
len=i-cur+1;
sn[s[i]]=i+1;
i++;
}
}
max=max>len?max:len;
return max;
}
cs