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.
題目分析
對于一給定字符串台夺,題目要求給出由互不相同的字母組成的子字符串的長度剂陡。
注意:這里的子字符串是指在原字符串中連續(xù)出現的字符串,而不是由字符串中各字母組成的子序列中拆魏。例如:
strs="pwwkew"
substring="wke";
subsequence="pwke"熟妓;
length=3;
字符串strs中所有互不相同的元素組成的子字符序列(subsequence)
是"pwke",然而栏尚,由于原字符串中字母'p'與'k'之間的'w'出現重復起愈,因此其不屬于子字符串。
解題思路
題目要求給出字符串的最長不重復子字符串的長度译仗。題目可采用滑動窗口的方法來解決抬虽。
定義兩個變量表示滑動窗的最前端(首位置)和最后端(末尾)。首位之間的字符串互不相同且連續(xù)纵菌,即最長不重復子字符串阐污。因而,窗長度的最大值即為所求咱圆。
首先將窗的尾設定在字符串起始位置笛辟,首位置設為1。如果如果窗首位置的字符串與窗內字符串互不相同序苏,則將窗首位置加一手幢,繼續(xù)與窗內字符比較;如果首位置字符與窗內內某一字符串相同忱详,則需要將窗的尾位置移動到窗內與首位置字符相同的字符索引加一的位置(即該字符后一字符的位置)以保證窗內所有字符串互不相同并且連續(xù)围来。依次滑動窗,并記錄滑動過程中窗的長度匈睁。窗長度的最大值即為所求最長不重復子字符串的長度监透。
特殊情況:
(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

**參考文獻**
[1] https://leetcode.com/problems/longest-substring-without-repeating-characters/#/description
[2] http://blog.csdn.net/fightforyourdream/article/details/17860983