欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

算法题精讲-leetcode3-给定字符串中无重复字符的最长子串

程序员文章站 2022-05-12 22:18:54
...

给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。

例如:

输入:"afashuih"
输出:5
最长字串为:"fashui"

解法一:写着很简单,但是jvm运行起来在骂娘的写法
解题思路:将随给字符串拆分为若干子字符串,逐一判断所有子字符串是否字符唯一,记录字符唯一的子字符串中最长的一个的长度

//大体思路:将随给字符串拆分为若干子字符串,逐一判断所有子字符串是否字符唯一,记录字符唯一的子字符串中最长的一个的长度
public class TestDemo {
	public static void main(String[] args) {
		//所需要判断的字符串
		String str  = "afashuih";
		int strLength = str.length();
		//记录 字符唯一的 最长的 子字符串
		int result = 0;
		//两层循环截取所有可能的子字符串
		for(int i = 0; i < strLength; i++){
			for(int j = i + 1; j <= strLength; j++){
				//if中判断该子字符串是否字符唯一
				if(chiledStrUnique(str,i,j)){
					//将当前子字符串的长度与result做比较
					result = Math.max(result, j - i);
				}
			}
		}
		System.out.println("当前需要判断的字符串为"+ str);
		System.out.println("无重复字符的最长子串的长度为"+ result);
	}
	//param(所给字符串, 子字符串从哪开始, 子字符串从哪结束)
	private static boolean chiledStrUnique(String str, int start, int end){
		// 保存子字符串字符,hash结构查找更快,时间复杂度为O(1),所以不用链表结构或数组结构
		Set<Character> set = new HashSet<>();
		for(int i = start; i<end; i++){
			char c = str.charAt(i);
			if(set.contains(c)){
				return false;
			}else{
				set.add(c);
			}
		}
		return true;
	}
}

算法题精讲-leetcode3-给定字符串中无重复字符的最长子串

解法二:通过滑动窗口来实现
解题思路:遍历所给字符串,滑动窗口中保存当前没有重复字符的区间,滑动窗口长度的最大值就是最终结果。

滑动窗口【i,j记录滑动窗口的区间大小,j - i + 1 = 滑动窗口长度】:
算法题精讲-leetcode3-给定字符串中无重复字符的最长子串
图解:
算法题精讲-leetcode3-给定字符串中无重复字符的最长子串
滑动窗口的最大长度为6,则结果为6.

代码:

public class TestDemo {
    public static void main(String[] args) {
        String str = "afashuih";
        Integer ans = slidingWindow(str);
        System.out.println("当前需要判断的字符串为"+ str);
        System.out.println("无重复字符的最长子串的长度为"+ans);
    }

    private static Integer slidingWindow(String str) {
        //记录所给字符串长度
        int n = str.length();
        //初始化返回结果0
        int ans = 0;
        //map中保存所有遍历到的字符,如果存在重复字符,仅保存最后出现的字符
        Map<Character, Integer> map = new HashMap<>();
        for (int i = 0, j = 0; j<n; j++){
            char c = str.charAt(j);
            boolean flag = map.containsKey(c);
            if (flag){
                //注意此处需要判断之前的i有没有被跳过去,不能直接写成:  i = map.get(c);
                i = map.get(c) > i ? map.get(c) : i;
            }
            //将当前遍历到的字符放入map中
            map.put(c, j + 1);
            ans = Math.max(j - i + 1, ans);
        }
        return ans;
    }
}

算法题精讲-leetcode3-给定字符串中无重复字符的最长子串

▄█▀█●各位同仁,如果我的代码对你有帮助,请给我一个赞吧,为了下次方便找到,也可关注加收藏呀
如果有什么意见或建议,也可留言区讨论