Description
Given a string, find the length of the longest substring without repeating characters.
Examples:
Given "abcabcbb", the answer is "abc", which the length is 3.
Given "bbbbb", the answer is "b", with the length of 1.
Given "pwwkew", the answer is "wke", with the length of 3. Note that the answer must be a substring, "pwke" is a subsequence and not a substring.
题目分析
对于一给定字符串,题目要求给出由互不相同的字母组成的子字符串的长度。
注意:这里的子字符串是指在原字符串中连续出现的字符串,而不是由字符串中各字母组成的子序列中。例如:
strs="pwwkew"
substring="wke";
subsequence="pwke";
length=3;
字符串strs中所有互不相同的元素组成的子字符序列(subsequence)
是"pwke",然而,由于原字符串中字母'p'与'k'之间的'w'出现重复,因此其不属于子字符串。
解题思路
题目要求给出字符串的最长不重复子字符串的长度。题目可采用滑动窗口的方法来解决。
定义两个变量表示滑动窗的最前端(首位置)和最后端(末尾)。首位之间的字符串互不相同且连续,即最长不重复子字符串。因而,窗长度的最大值即为所求。
首先将窗的尾设定在字符串起始位置,首位置设为1。如果如果窗首位置的字符串与窗内字符串互不相同,则将窗首位置加一,继续与窗内字符比较;如果首位置字符与窗内内某一字符串相同,则需要将窗的尾位置移动到窗内与首位置字符相同的字符索引加一的位置(即该字符后一字符的位置)以保证窗内所有字符串互不相同并且连续。依次滑动窗,并记录滑动过程中窗的长度。窗长度的最大值即为所求最长不重复子字符串的长度。
特殊情况:
(1)空字符串,此时返回0;
(2)字符串长度为1,长度为1,不管是空格还是其他字符,其子字符串均为其本身,因此返回1。
C语言代码
int lengthOfLongestSubstring(char* s) {
int len=strlen(s);
if(len==0) //长度为零,返回0;
return 0;
if(len==1) //长度为1,返回1.
return 1;
int i=0,j=0,lls=1,k=0; //i表示窗首首,j表示窗尾位置lls表示窗长度,i-j+1即为当前窗口的长度
{
for(k=j;k<i;k++)
if(s[i]==s[k])
{
j=k+1;
if((i-j+1)>lls)
lls=i-j+1;
break;
}
if(k==i&&(i-j+1)>lls) //窗长度大于记录最大值,则更新。否则保持不变,
lls=i-j+1;
}
return lls;
}
运行时间:15ms
![Accepted Solutions Runtime Distribution.png](http://upload-images.jianshu.io/upload_images/815734-d05aca7bdfabd554.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
**参考文献**
[1] https://leetcode.com/problems/longest-substring-without-repeating-characters/#/description
[2] http://blog.csdn.net/fightforyourdream/article/details/17860983