查找最长无重复字符串子串编程问题
给定一个字符串 “abccabd”,查找出没有重复字符的字符串子串的最大长度。
主要应用了滑窗移动的思想,需要提前创建一个Hashset 集合来存储字符串。
定义一个区间[i,j],i和j的初始值都为0,开始每次j向右移动一格,判断此时的字符是否在前面创建的Hashset中存在,如果不存在则将这个字符加入创建好的Hashset中,同时记录此时的长度,与上一个记录的长度比较取最大值。
当j向右移动一格找到的字符存在已有的集合中时,将逐渐移除这个集合中的前面的字符,直到移除了此时标记了的字符。
具体代码如下
public class lengthOfLongestSubstring { public static void main(String[] args) { // TODO Auto-generated method stub String str ="aaabcbxfsasd"; System.out.println(lengthOfLongestSubstring(str)); } private static int lengthOfLongestSubstring(String str) { // TODO Auto-generated method stub int len=0; int strlength = str.length(); int i=0; int j=0; HashSet<Character> hs = new HashSet<Character>(); while(i<strlength&&j<strlength) { if(!hs.contains(str.charAt(j))) { hs.add(str.charAt(j++)); len =Math.max(len, j-i); }else { hs.remove(str.charAt(i++)); } } return len; } }
更新使用map来存储数值,以达到简化代码的作用
class Solution { public int lengthOfLongestSubstring(String s) { int n = s.length(), ans = 0; Map<Character, Integer> map = new HashMap<>(); for (int end = 0, start = 0; end < n; end++) { char alpha = s.charAt(end); if (map.containsKey(alpha)) { start = Math.max(map.get(alpha), start); } ans = Math.max(ans, end - start + 1); map.put(alpha, end + 1); } return ans; } }