无重复字符的最长子串
class Solution { public: int lengthOfLongestSubstring(string s) { int len = s.length(); // 对于字符串长为0时特殊处理(这里需要这么做,是因为最后答案输出时是ans + 1 if(len == 0) return 0; //头尾下标指针初始化 int st = 0, en = 0; int ans = 0; bool ch[128]; // ch数组按照ASCII码的值记录每个字符是否已被使用 memset(ch, false, sizeof(ch)); // 记录第一位的字符 ch[s[0]] = true; // 注意,因为String存储范围的下标其实是 0..(len-1),因此全部处理成en + 1 < len while(en + 1 < len) { // 利用贪心,如果下一位超出String范围,或是已被使用过,则退出循环 while(en + 1 < len && !ch[s[en + 1]]) { en ++; ch[s[en]] = true; } // 由于ans存储的是尾指针-头指针的数值,因此比实际长度小1 ans = max(ans, en - st); // 头指针后移一位 ch[s[st]] = false; st ++; } // 这里使用ans + 1输出是为了将len = 1的情况一起包括进来,感兴趣的码友可以尝试一下此类数据 return ans + 1; } }; 作者:iswJXkYVv3 链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/solution/c-8ms93mb-jian-dan-tan-xin-by-iswjxkyvv3/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
可完整运行的c程序版:
#include <stdio.h> # include <string.h> int lengthOfLongestSubstring(char *s) { int len = strlen(s); if(len == 0) return 0; int st = 0, en = 0; int ans = 0; bool ch[128]; memset(ch, false, sizeof(ch)); ch[s[0]] = true; while(en + 1 < len) { while(en + 1 < len && !ch[s[en + 1]]) { en ++; ch[s[en]] = true; } if (ans<en - st) ans=en-st; for( ;;st++) { if (s[st]==s[en+1]) { st=st+1; break; } else { ch[s[st]]=false; } } en=en+1; } return ans+1; } int main(void) { char *msg; msg = (char *) "abcbb"; int len=lengthOfLongestSubstring(msg); printf("%d",len); return 0; }