最长子串
描述
给定一个只含'0'~'9'、'A'~'Z'、'a'~'z'的字符串(1≤长度≤10000),请你找出其中不含有重复字符的最长子串的长度。
输入
一个字符串
输出
一个整数,表示最长子串的长度
输入样例 1
abcabcbb
输出样例 1
3
说明:因为无重复字符的最长子串是 "abc",所以其长度为 3。
输入样例 2
bbbbb
输出样例 2
1
说明:因为无重复字符的最长子串是 "b",所以其长度为 1。
输入样例 3
pwwkew
输出样例 3
3
说明:因为无重复字符的最长子串是 "wke",所以其长度为 3。
来源
XMU
#include <stdio.h>
#include <string.h>
int longest_substring(int *t, int len_t)
{
int position[63] = { 0 };
int start = 1, end = 0;
int current_len = 0, max_len = 0;
for (int i = 1; i <= len_t; ++i)
{
if (position[t[i]])
{
for (int j = start; j < position[t[i]]; ++j)
position[t[j]] = 0;
start = position[t[i]] + 1;
end = i;
position[t[i]] = i;
current_len = end - start + 1;
if (current_len > max_len)
max_len = current_len;
}
else
{
position[t[i]] = i;
end++;
current_len++;
if (current_len > max_len)
max_len = current_len;
}
}
return max_len;
}
int main()
{
char s[10002] = { 0 };
scanf("%s", s);
int len_s = (int)strlen(s);
int t[10002] = { 0 };
for (int i = 1; i <= len_s; ++i)
{
if ('0' <= s[i-1] && s[i-1] <= '9')
t[i] = s[i-1] - '0';
else if ('A' <= s[i-1] && s[i-1] <= 'Z')
t[i] = 10 + s[i-1] - 'A';
else
t[i] = 10 + 26 + s[i-1] - 'a';
}
int length = longest_substring(t, len_s);
printf("%d", length);
return 0;
}