LeetCode算法第三题无重复字符串

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;
}

直接使用一个数组来判断是否有重复,只能说牛!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值