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.
題目分析
對(duì)于一給定字符串,題目要求給出由互不相同的字母組成的子字符串的長(zhǎng)度。
注意:這里的子字符串是指在原字符串中連續(xù)出現(xiàn)的字符串,而不是由字符串中各字母組成的子序列中。例如:
strs="pwwkew"
substring="wke";
subsequence="pwke";
length=3;
字符串strs中所有互不相同的元素組成的子字符序列(subsequence)
是"pwke",然而,由于原字符串中字母'p'與'k'之間的'w'出現(xiàn)重復(fù),因此其不屬于子字符串。
解題思路
題目要求給出字符串的最長(zhǎng)不重復(fù)子字符串的長(zhǎng)度。題目可采用滑動(dòng)窗口的方法來(lái)解決。
定義兩個(gè)變量表示滑動(dòng)窗的最前端(首位置)和最后端(末尾)。首位之間的字符串互不相同且連續(xù),即最長(zhǎng)不重復(fù)子字符串。因而,窗長(zhǎng)度的最大值即為所求。
首先將窗的尾設(shè)定在字符串起始位置,首位置設(shè)為1。如果如果窗首位置的字符串與窗內(nèi)字符串互不相同,則將窗首位置加一,繼續(xù)與窗內(nèi)字符比較;如果首位置字符與窗內(nèi)內(nèi)某一字符串相同,則需要將窗的尾位置移動(dòng)到窗內(nèi)與首位置字符相同的字符索引加一的位置(即該字符后一字符的位置)以保證窗內(nèi)所有字符串互不相同并且連續(xù)。依次滑動(dòng)窗,并記錄滑動(dòng)過(guò)程中窗的長(zhǎng)度。窗長(zhǎng)度的最大值即為所求最長(zhǎng)不重復(fù)子字符串的長(zhǎng)度。
特殊情況:
(1)空字符串,此時(shí)返回0;
(2)字符串長(zhǎng)度為1,長(zhǎng)度為1,不管是空格還是其他字符,其子字符串均為其本身,因此返回1。
C語(yǔ)言代碼
int lengthOfLongestSubstring(char* s) {
int len=strlen(s);
if(len==0) //長(zhǎng)度為零,返回0;
return 0;
if(len==1) //長(zhǎng)度為1,返回1.
return 1;
int i=0,j=0,lls=1,k=0; //i表示窗首首,j表示窗尾位置lls表示窗長(zhǎng)度,i-j+1即為當(dāng)前窗口的長(zhǎng)度
{
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) //窗長(zhǎng)度大于記錄最大值,則更新。否則保持不變,
lls=i-j+1;
}
return lls;
}
運(yùn)行時(shí)間:15ms

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