leetcode-3. 无重复字符的最长子串

问题描述:给定一个字符串,查找字符串中无重复字符字串的最大长度。

eg1:
输入:"abcabcbb"
输出:3
说明:无重复字符的最长字串为"abc",长度为3
eg2:
输入:"bbbbb"
输出:1
说明:无重复字符的最长字串为"b",长度为1

算法分析:

在处理字符串以及数组类的元素时,滑动窗口是一个常用的算法。

滑动窗口算法简单描述为使用双指针[left,right)来确定字串对应的窗口大小,catagery[length=128]存储已经出现过的元素。算法开始后right指针右移,检查对应的元素,满足条件后catagery存储有效信息,right指针继续右移;条件不满足,移除左指针对应元素的有效信息,并右移检查窗口内的各个元素。

算法实现:

public class Solution {
	public int lengthOfLongestSubstring(String s) {
		if (s == null || s.isEmpty())
			return 0;
		int charset[] = new int[256];
		int max = 0;
		int len = s.length();
		// [i,j)为当前的滑动窗口
		for (int i = 0, j = 0; i < len && j < len;) {
			if (charset[s.charAt(j)] == 0) {
				// 窗口内尚未出现过右指针对应的元素,在元素对应的仓库中记录当前节点的有效长度
				charset[s.charAt(j)] = j - i + 1;
				max = max > charset[s.charAt(j)] ? max : charset[s.charAt(j)];
				j++;
			} else {
				// 窗口中出现重复元素,滑动左指针检查仓储,剔除重复元素
				charset[s.charAt(i)] = 0;
				i++;
			}
		}
		return max;
	}
}

 

你可能感兴趣的:(算法,算法研究)