最大子字符串,哈希,O(n)

Description

Given a string, find the length of the longest substring without repeating characters.

Examples:

Given "abcabcbb", the answer is "abc", which the length is 3.

Given "bbbbb", the answer is "b", with the length of 1.

Given "pwwkew", the answer is "wke", with the length of 3. Note that the answer must be a substring"pwke" is a subsequence and not a substring.

Solution

1. 用max表示到目前为止的最大子字符串的长度,用tmp记录当前字符结尾的最大子字符串长度,用hash[arr[i]]表示第i个字符arr[i]最后一次出现的索引加1( 考虑到hash数组初始值均为0),例如对于"abcbacbb",当索引(从0开始)为2时,char=‘c’, max = 3, tmp = 3(对应abc). 当索引为3时,char='b', max = 3, tmp = 2(对应cb);

2. 每次迭代当索引为index时,判断当前字符是否已经出现过,如果未出现过,则tmp = tmp + 1, 如果已出现过,则tmp = min(tmp + 1, index + 1 - hash[arr[i]]);

3. 每次迭代索引为index时,更新hash,hash[arr[index]] = index + 1(考虑到hash数组初始值均为0);

Code

	public int maxSubstring(String s) {
		char[] arr = s.toCharArray();
		// 'hash' saves the index of character at the last seen
		int[] hash = new int[255];
		int max = 0;
		// 'tmp' is the length of the longest subString with the end of 'arr[i]' at the time 
		for (int i = 0, tmp = 0; i < s.length(); i++) {
			tmp = Math.min(i + 1 - hash[arr[i]], tmp + 1);
			max = Math.max(tmp, max);
			hash[arr[i]] = i + 1;
		}
		return max;
	}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值