LeetCode 第三题,官方给的标准答案的一个分析,利用空间换时间,将复杂度降到了O(n)
2017-06-01 18:12
323 查看
int lengthOfLongestSubstring(string s) {
int n = s.length();
int i = 0, j = 0; //i表示当前搜索串的起始位置,j表示当前搜索串的结束位置
int maxLen = 0;
bool exist[256] = { false }; //表示当前字符在当前搜索串中有没有出现
while (j < n) {
if (exist[s[j]]) { //如果当前串中出现了该字符
maxLen = max(maxLen, j-i); //计算当前字符的长度,如果大于原来的最大长度,则把它赋值给最大长度
while (s[i] != s[j]) { //例如当前串为bacd,i指向b,j指向字符a
exist[s[i]] = false; //这种情况下就需要把b标志为不在当前串中,起始位置后移,重新扫描新子串
i++;
}
i++;
j++;
} else { //当前字符如果在搜索串中没有出现 ,标记它为当前串中的字符
exist[s[j]] = true;
j++;
}
}
maxLen = max(maxLen, n-i); //空串和字符串的情况
return maxLen;
}
int n = s.length();
int i = 0, j = 0; //i表示当前搜索串的起始位置,j表示当前搜索串的结束位置
int maxLen = 0;
bool exist[256] = { false }; //表示当前字符在当前搜索串中有没有出现
while (j < n) {
if (exist[s[j]]) { //如果当前串中出现了该字符
maxLen = max(maxLen, j-i); //计算当前字符的长度,如果大于原来的最大长度,则把它赋值给最大长度
while (s[i] != s[j]) { //例如当前串为bacd,i指向b,j指向字符a
exist[s[i]] = false; //这种情况下就需要把b标志为不在当前串中,起始位置后移,重新扫描新子串
i++;
}
i++;
j++;
} else { //当前字符如果在搜索串中没有出现 ,标记它为当前串中的字符
exist[s[j]] = true;
j++;
}
}
maxLen = max(maxLen, n-i); //空串和字符串的情况
return maxLen;
}
相关文章推荐
- 一串首尾相连的珠子(m个),有N种颜色(N《=10),设计一个算法,取出其中一段,要求包含所有N中颜色,并使长度最短。并分析时间复杂度与空间复杂度
- 利用Clion对几种排序算法进行时间复杂度与空间复杂度的分析
- 对于一颗完全二叉树,要求给所有节点加上一个pNext指针,指向同一层的相邻节点;如果当前节点已经是该层的最后一个节点,则将pNext指针指向NULL;给出程序实现,并分析时间复杂度和空间复杂度。
- 对于一颗完全二叉树,要求给所有节点加上一个pNext指针,指向同一层的相邻节点;如果当前节点已经是该层的最后一个节点,则将pNext指针指向NULL;给出程序实现,并分析时间复杂度和空间复杂度。
- 一串首尾相连的珠子(m 个),有N 种颜色(N<=10),设计一个算法,取出其中一段,要求包含所有N 中颜色,并使长度最短。并分析时间复杂度与空间复杂度。
- 对于一颗完全二叉树,要求给所有节点加上一个pNext指针,指向同一层的相邻节点;如果当前节点已经是该层的最后一个节点,则将pNext指针指向NULL;给出程序实现,并分析时间复杂度和空间复杂度。
- 一串首尾相连的珠子(m个),有N种颜色(N《=10),设计一个算法,取出其中一段,要求包含所有N中颜色,并使长度最短。并分析时间复杂度与空间复杂度。
- 一串首尾相连的珠子(m 个),有N 种颜色(N<=10),设计一个算法,取出其中一段,要求包含所有N 中颜色,并使长度最短。并分析时间复杂度与空间复杂度。
- 一串首尾相连的珠子(m个),有N种颜色(N《=10),设计一个算法,取出其中一段,要求包含所有N中颜色,并使长度最短。并分析时间复杂度与空间复杂度。
- 查找无序数组中的一个元素下标,并分析时间和空间复杂度, 考虑效率(很重要)
- 长度为n的顺序表L,编写一个时间复杂度为O(n),空间复杂度为O(1)的算法,该算法删除线性表中所有值为X的元素
- 给定一个存放整数的数组,重新排列数组使得数组左边为奇数,右边为偶数。 要求:空间复杂度O(1),时间复杂度为O(n)。
- 一个整型数组里除了两个数字之外,其他的数字都出现了两次。 请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n), 空间复杂度是O(1)
- 数据挖掘算法的空间复杂度与时间复杂度分析
- 一个台阶总共有n级,如果一次可以跳1级,也可以跳2级。 //求总共有多少总跳法,并分析算法的时间复杂度
- 找出一个数组中出现次数超过一半的那个数字,要求时间复杂度O(n)和空间复杂度为O(1)。
- 一个整型数组里除了一个或者两个或者三个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)
- 一个数组中,存在两个只出现一次的数字,其余的数字均出现两次。要求在时间复杂度o(n),空间复杂度为o(1)的情况下找出这两个数字
- 一个时间复杂度为O(n),空间复杂度为O(1)的排序算法
- 一个整型数组里除了一个或者两个或者三个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)