Longest Substring Without Repeating Characters

题目链接:

https://leetcode.com/problems/longest-substring-without-repeating-characters/

题目要求是,求出最长无重复子序列的长度。

比如:

maxLen(abba) = 2;

maxLen(pawwakew) = 4;

maxLen(leetcode) = 5;

 

解题思路:

利用哈希表,定义一个数组charIndex[128],用来保存对应位置的字符的最新下标,每次该数组被更新时,说明遇到了重复字符。

定义3个变量start、to、maxLen,start用来表示不重复字符的开始位置,当遇到重复字符时,更新start的值;to用来遍历字符串数组,maxLen用来记录最大无重复的子序列的长度。

另外,还要注意几种特殊情况。

代码如下:

public int lengthOfLongestSubstring(String s) {
	if(s.equals(""))
		return 0;
	if(s.length() == 1)
		return 1;
	
	int start = 0, to = 0;	// start无重复子序列的开始位置;to用于遍历字符串
	int maxLen = 1;	// 无重复子序列的最大长度
	int[] charIndex = new int[128];	// 记录对应字符的最新下标
	for(int i = 0; i < 128; i ++)
		charIndex[i] = -1;
	
	for(to = 0; to < s.length(); to ++) {
		int repeatIndex = charIndex[s.charAt(to)]; // 找到数组charIndex中该字符对应的位置
		
		// 如果该位置不为-1,表示遇到了重复字符
		if(repeatIndex >= start && repeatIndex != -1) {
			if(to - start > maxLen)
				maxLen = to - start;					
			start = repeatIndex + 1;	// 改变start的值
		} 
		
		// 处理边界情况
		if(to == s.length() - 1) {
			if(to - start + 1 > maxLen)
				maxLen = to - start + 1;
		}
		
		// 每次遍历,无论该字符是否重复,都一律记录其位置
		charIndex[s.charAt(to)] = to;
	}
	
	return maxLen;
}

  

  

posted @ 2016-03-17 22:38  qq2262988  阅读(146)  评论(0编辑  收藏  举报