给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例 2:
输入: “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
示例 3:
输入: “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。
来源:LeetCode
enum {
ONE = 1,
TWO
};
int g_final[2];
int g_temp[2];
void InitStartEnd()
{
g_final[0] = 0;
g_final[1] = 0;
g_temp[0] = g_temp[1] = 0;
}
int lengthOfLongestSubstring(char * s)
{
if (!s) {
return -1;
}
int len = strlen(s);
if (len == 0 || len == 1) {
return len;
}
InitStartEnd();
int isExistInSub = 0;
for (int i = 1; i < len; ++i) {
isExistInSub = 0;
for (int j = g_temp[0]; j <= g_temp[1]; ++j) { /* 查找是否已经出现过 */
if (s[i] == s[j]) {
if (g_temp[1] - g_temp[0] > g_final[1] - g_final[0]) {
g_final[1] = g_temp[1];
g_final[0] = g_temp[0];
}
g_temp[0] = j + ONE;
g_temp[1] = i;
if (len - g_temp[0] < g_final[1] - g_final[0]) {
return g_final[1] - g_final[0] + ONE;
}
isExistInSub = 1;
break;
}
}
if (!isExistInSub) {
g_temp[1]++;
}
}
return g_final[1] - g_final[0] + ONE > g_temp[1] - g_temp[0] + ONE ? g_final[1] - g_final[0] + ONE : g_temp[1] - g_temp[0] + ONE;
}