Longest Substring Without Repeating Characters

Given a string, find the length of the longest substring without repeating characters. For example, the longest substring without repeating letters for "abcabcbb" is "abc", which the length is 3. For "bbbbb" the longest substring is "b", with the length of 1.


开始拿到这道题的时候,开始没什么思路。后来在纸上画了一画,才发现了算法,其实也就用到了一个flag+哈希表。从左往右逐个字符遍历字符串,开始flag设置为-1。每遍历一个字符,若与左边已遍历过的字符没有冲突,则将当前字符的索引cur存入哈希表中。哈希函数f(key)=key,key为字符的ASCII码。若第一次发生冲突,则算出这次遍历得出的最长子串的长度(cur - flag -1),与此前的len比较判断是否需要更新len,并在哈希表中将当前字符的索引cur覆盖前面这个字符的索引rep,再令flag = rep。但此时还要注意两种特殊情况:一种是遍历完全部字符串都没有发生冲突,则直接返回字符串的长度;第二种是若最后一个字符在当前这次遍历中(即flag置位后)没有发生冲突,则此次遍历得出的最长子串的长度为(cur - flag)。

Runtime:4ms

#define N 150
int searchHashTable(int * hashTable,char c)
{
	int index = c;					//hash function
	if( hashTable[index] >= 0 )
		return hashTable[index];
	else
		return -1;
}
int lengthOfLongestSubstring(char* s) {
    int len = 0,flag = -1,r = 0,strLen,cur;
	strLen = strlen(s);
	int hashTable[N],rep;
	for( cur = 0 ; cur < N ; cur++)
		hashTable[cur] = -1;
	for( cur = 0 ; cur < strLen ; cur++ )
	{
		rep = searchHashTable(hashTable,s[cur]);
		if( rep == -1 || rep <= flag )
		{
			hashTable[ s[cur] ] = cur;	//fill in character's index of s string.
			if( cur == strLen - 1 )		//boder situation:the last character does not collide.
			{
				len = len >= ( cur - flag ) ? len : ( cur - flag );
			}
		}
		else
		{
			r = 1;
			len = len >= ( cur - flag -1 ) ? len : ( cur - flag -1 );
			hashTable[ s[cur] ] = cur;	//use the bigger index to cover the smaller one.
			flag = rep; 
		}
	}
	if( r )
		return len;
	else					<span style="white-space:pre">	</span>//special situation:no collision occurs.
		return strLen;
}


小结:

1.注意哈希表的使用:1)哈希函数;2)哈希表的大小,一定要能覆盖所有的f(key)值。

2.注意题目中的特殊情况与边界情况。

3.想不动时动动手,光动手不好好想也不行。学会抽象和归纳,用机器的角度思考问题。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值