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

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

例如:

输入:"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;
	}
}

在这里插入图片描述

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

滑动窗口【i,j记录滑动窗口的区间大小,j - i + 1 = 滑动窗口长度】:
在这里插入图片描述
图解:
在这里插入图片描述
滑动窗口的最大长度为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 = map.get(c);
            }
            //将当前遍历到的字符放入map中
            map.put(c, j + 1);
            ans = Math.max(j - i + 1, ans);
        }
        return ans;
    }
}

在这里插入图片描述

发布了17 篇原创文章 · 获赞 17 · 访问量 3084

猜你喜欢

转载自blog.csdn.net/weixin_43954926/article/details/104012225