给定一个字符串,找出其不含重复字符的最长子串的长度。例如,”abcabcbb”不含重复字符的最长子串是”abc”,长度是3。”bbbbb”的最长子串是”b”,长度是1。
我的想法:
- 类似动态规划,依次计算以第某个字符为结尾的最长子串,如果它不在它前一个字符为结尾的最长子串中,则它加入这个子串。否则,它在这个“以它前一个字符为结尾的最长子串”中的位置的下一位可以作为以它为结尾的最长子串的开始。
- 一边查找最长子串,一边更新最长子串长度。
C89(6ms):
char* _strnchr(char *start, char *end, char ch)
{
char *i = start;
for(; i != end; ++i)
{
if(*i == ch)
{
break;
}
}
return i;
}
int lengthOfLongestSubstring(char *s)
{
int llsub = 0, tmp;
char *nstart, *lstart = s, *i = s;
for(; *i != '\0'; ++i)
{
if((nstart = _strnchr(lstart, i, *i)) != i)
{
lstart = nstart + 1;
}
else
{
if((tmp = i - lstart + 1) > llsub)
{
llsub = tmp;
}
}
}
return llsub;
}