leetcode 3:無重複字元的最長子串
阿新 • • 發佈:2018-12-09
給定一個字串,找出不含有重複字元的最長子串的長度。
示例 1:
輸入: "abcabcbb" 輸出: 3 解釋: 無重複字元的最長子串是 "abc",其長度為 3。
示例 2:
輸入: "bbbbb" 輸出: 1 解釋: 無重複字元的最長子串是 "b",其長度為 1。
示例 3:
輸入: "pwwkew" 輸出: 3 解釋: 無重複字元的最長子串是 "wke",其長度為 3。 請注意,答案必須是一個子串,"pwke"是一個子序列 而不是子串。j
解法一:
int lengthOfLongestSubstring(char *s) { int length = strlen(s); char *temps = (char *)malloc(length*sizeof(char));//輔助陣列 int count = 0;//輔助陣列index int start = 0;//最長字串起始index int len = 0;//最長字串長度 bool isok = true; for (int i = 0; i < length;) { if (isok) temps[count++] = s[i++];//加入新元素 isok = true;//標誌位置位 for (int j = start; j < count-1; j++)//檢測新加入的元素是否已經存在 { if (temps[j] == s[i-1])//如果已經存在,break,起始字元後移 { isok = false;//標誌位置位 start++;//起始字元後移 break; } } len = len>(i - start) ? len : (i - start);//計算長度 } return len; }
解法二:發現自己蠢了,不用建立什麼輔助陣列,建立個頭尾用滑窗就好啦
int lengthOfLongestSubstring(char* s) { int start = 0, end = 1;//設定滑窗頭尾 int maxlen = 1;//最大長度 if (!strlen(s)) { return 0; } else if(strlen(s) == 1) { return 1; } int len = strlen(s); for(;end<len;end++) { for(int i = start;i<end;i++) { if(*(s+i) == *(s+end))//比較下一個元素和滑窗已有元素 { start = i + 1; break; } } if ((end - start)+1 > maxlen)//比較大小 maxlen = (end - start) + 1; } return maxlen; }
解法三:利用map容器
class Solution { public: /** * @param s * @return */ int lengthOfLongestSubstring(string s) { // write your code here int ret = 0; map<char, int> m; int start = 1; for (int i = 1; i <= s.length(); i++) { char c = s[i - 1]; if (m[c] >= start) { start = m[c] + 1; m[c] = i; } else { m[c] = i; ret = max(ret, i - start + 1); } } return ret; } };