Longest Substring Without Repeating Characters 字串中最長的無重複子串長度,longestrepeating
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;}};
暴力法雖然簡單,但時間過不了,下面用一個複雜度為n的演算法
思路:
用一個256位元組asc[](字元共有256個,包括128個擴充字元),字串中每一個字元的ASCII值對應該字元在數組中的位置
如字元a 在 asc[a]中的下標為97
初始化數組asc,令每一個元素為-1。定義start,start表示每次無重複字串的其實點,初始值為0.從i=0開始遍曆字串,如果數組asc中沒有出現該字元(asc[ch]==-1),那麼令asc[ch]==i,記錄下來該字元在字串中的位置,接著遍曆,如果遇到asc[ch]!=-1表示該字元已經出現了,需要將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]=-1; for(i=0;i<s.length();i++) { if(a[s[i]]!=-1) { if(result<i-start) result=i-start; for(j=start;j<a[s[i]];j++) a[j]=-1; start=max(start,a[s[i]]+1); // result=max(result,i-start); } a[s[i]]=i; } result=max(result,i-start); return result; }};</span>