LeetCode算法第三题
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
int Length_of_Longest_Substring(char* s) {
char* s1, * s2;
int count = 1, max = 0, i = 0;
if (*s == '\0')
return 0;
for (s1 = s+1 ; *s1 != '\0'; s1++) {
for (s2 = s + i, count = 1; s2 != s1; s2++) {
if (*s1 == *s2) {
i += count;
break;
}
else
count++;
}
if (count > max)
max = count;
}
return count > max ? count : max;
}
解题思路就是将无重复的子串单独存起来,一旦出现重复的时候,要寻找移动的长度。
如:abcabcbb
首先判断字符串不为空,开始时s1指向b(字符串不为空时最小长度即为1),s2从头遍历到s2位置是结束。当s1指向第四位的a时,s2指向的a重复,则退出,s1++,而此时s2从a的下一位开始遍历,因为在s1和s2之间必存在一个a,代码中i即为保存这个移动长度的变量。
题解中有更简单的解题思路如下:
int Length_of_Longest_Substring(char* s) {
int i, j = 0, count = 0, max = 0, start = 0;
int index[128] = { 0 };
for (i = 0; s[i] != '\0'; i++) {
if (index[s[i]] > start) {
count = i - start;
if (count > max)
max = count;
start = index[s[i]];
}
index[s[i]] = i + 1;
}
count = i - start;
return count > max ? count : max;
}
直接使用一个数组来判断是否有重复,只能说牛!