Longest Substring Without Repeating Characters 字符串中最長的無重復子串長度
來源:程序員人生 發布時間:2014-12-16 08:43:16 閱讀次數:3398次
Longest Substring Without Repeating Characters
Given
a string, find the length of the longest substring without repeating characters. For example, the longest substring without repeating letters for "abcabcbb" is "abc", which the length is 3. For "bbbbb" the longest substring is "b", with the length of 1.
題目的意思是求字符串中最長的無重復子串長度,如上面的
abcabcbb 最長無重復子串為abc 長度為3
直接暴力法:代碼以下
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int i,j,temp,result=1;
for(i=0;i<s.length();i++)
{
temp=1;
for(j=0;j<s.length()-i;j++)
{
if(check(s,i,j))
temp++;
else
continue;
}
result=max(result,temp);
}
return result;
}
bool check(string s,int i,int j)
{
char ch=s[j];
for(int t=i;t<j;t++)
{
if(ch==s[t])
{
return false;
}
}
return true;
}
};
暴力法雖然簡單,但時間過不了,下面用1個復雜度為n的算法
思路:
用1個256位數組asc[](字符共有256個,包括128個擴大字符),字符串中每個字符的ASCII值對應當字符在數組中的位置
如字符a
在 asc[a]中的下標為97
初始化數組asc,令每個元素為⑴。定義start,start表示每次無重復字符串的其實點,初始值為0.從i=0開始遍歷字符串,如果數組asc中沒有出現該字符(asc[ch]==⑴),那末令asc[ch]==i,記錄下來該字符在字符串中的位置,接著遍歷,如果遇到asc[ch]!=⑴表示該字符已出現了,需要將start到j的asc數組中的元素抹掉。然后重置start,令start=max(asc[i]+1,start);然后將
最后結果為 result=max(result,i-start);
代碼以下:
<span style="font-size:18px;">class Solution {
public:
int lengthOfLongestSubstring(string s) {
int result=0;
int a[128];
int i,j,t,start=0;
for(i=0;i<128;i++)
a[i]=⑴;
for(i=0;i<s.length();i++)
{
if(a[s[i]]!=⑴)
{
if(result<i-start)
result=i-start;
for(j=start;j<a[s[i]];j++)
a[j]=⑴;
start=max(start,a[s[i]]+1);
// result=max(result,i-start);
}
a[s[i]]=i;
}
result=max(result,i-start);
return result;
}
};</span>
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈