題目來源:https://leetcode.com/problems/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
解題思路:
用一個start來記錄目前字符串的開頭 用exist[MAX]來記錄目前字符串中出現過的字母 用pos[MAX]來記錄出現過的字符串的字母的位置 然後我們往後走一位,然後和exist來比較看這個字母是否已經出現過了。 1 如果出現過了,那麼我們把start移動到之前那個字母出現的位置的後一位,end往後移動一位 2 如果沒有出現過,那麼我們就把end往後移動一位 提交代碼:1 class Solution { 2 public: 3 int lengthOfLongestSubstring(string s) { 4 // Start typing your C/C++ solution below 5 // DO NOT write int main() function 6 int locs[256];//保存字符上一次出現的位置 7 memset(locs, -1, sizeof(locs)); 8 9 int idx = -1, max = 0;//idx為當前子串的開始位置-1 10 for (int i = 0; i < s.size(); i++) 11 { 12 if (locs[s[i]] > idx)//如果當前字符出現過,那麼當前子串的起始位置為這個字符上一次出現的位置+1 13 { 14 idx = locs[s[i]]; 15 } 16 17 if (i - idx > max) 18 { 19 max = i - idx; 20 } 21 22 locs[s[i]] = i; 23 } 24 return max; 25 } 26 };
其他解題方法:
1 #include <bits/stdc++.h> 2 #define MAX 110 3 4 using namespace std; 5 6 int pos[MAX], exist[MAX]; 7 8 int main() 9 { 10 string s; 11 int lens,i,j,start,max_num; 12 while(cin>>s) 13 { 14 lens=s.size(); 15 max_num=0,start=0; 16 memset(pos,0,sizeof(pos)); 17 memset(exist,0,sizeof(exist)); 18 for(i=0;i<lens;i++) 19 { 20 if(exist[s[i]-'a']) 21 { 22 for(j=start;j<=pos[s[i]-'a'];j++) 23 exist[s[j]-'a']=0; 24 start=pos[s[i]-'a']+1; 25 exist[s[i]-'a']=1; 26 pos[s[i]-'a']=i; 27 } 28 else 29 { 30 exist[s[i]-'a']=1; 31 pos[s[i]-'a']=i; 32 max_num=max(max_num,i-start+1); 33 } 34 } 35 printf("%d\n",max_num); 36 } 37 }