趋势科技2011校园招聘的一道编程笔试题
题目:编写一个函数int search(char *text),text为输入的字符串,从字符串中找出一个最长的不含重复字符的子字符串,例如“axdbx”,返回4,子字符串为“axdb”,而“axdbxce”,返回5,子字符串为“dbxce”。
以下是我的答案,当然,较当时答题时的答案少有改动,但思路是一样的,毕竟答题时没有环境让我去debug。该算法时间复杂度为O(n)。并且不需要反复重置pos数组,每次访问到重新赋值即可。
int find_max_str(char* test)
{
int start = 0;
int end = strlen(test);
int max_length = 0;
int asc2[128];
//初始化表
for(int i = 0; i < 128; i++)
asc2[i] = -1;
//遍历字符串
for (int j = 0; j < end; j++)
{
int index = test[j];
if (asc2[index] > start)
{
int t1 = asc2[index] - start + 1;
if (max_length < t1)
{
max_length = t1;
}
start = asc2[index] + 1;
}
asc2[index] = j;
}
int t2 = end - start;
if(t2 > max_length)
return t2;
else
return max_length;
}
http://joke.li/blog/archives/359