算法分析:
1)使用滑动窗口算法。
/* 字符串 i到j中是否含有重复的字符 */
static bool IsUniqe(char *s, int i, int j)
{
int charSet[128] = {0}; /* ASCII码表共128个字符集 */
int index = 0;
int setIndex = 0;
for (index = i; index <= j; index++) {
setIndex = *(s+index);
charSet[setIndex]++;
if (charSet[setIndex] > 1) {
return false;
}
}
return true;
}
/* 获取两个整数中较大的一个 */
static int GetMax(int num1, int num2)
{
if (num1 >= num2) {
return num1;
}
return num2;
}
int lengthOfLongestSubstring(char *s)
{
int left = 0;
int right = -1;
int len = 0;
int maxLen = 1;
if (s == NULL || strlen(s) == 0) {
return 0;
}
len = strlen(s);
if (len == 1) {
return 1;
}
while (right < len) {
while (right < len) {
right += 1;
/* 满足条件 */
if (IsUniqe(s, left, right) != true) {
maxLen = GetMax(right - left, maxLen);
break;
}
}
if (right == len) {
maxLen = GetMax(right - left, maxLen);
break;
}
while (left < right) {
left += 1;
/* 依然满足条件 */
if (IsUniqe(s, left, right) == true) {
break;
}
}
}
return maxLen;
}