查找最长无重复字符串子串编程问题 - Go语言中文社区

查找最长无重复字符串子串编程问题


给定一个字符串  “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;
    }
}

 

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_29660957/article/details/90319091
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2021-05-29 17:47:05
  • 阅读 ( 403 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

推荐文章

猜你喜欢