前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >算法练习(3)-寻找最大的不重复子串

算法练习(3)-寻找最大的不重复子串

作者头像
菩提树下的杨过
发布2020-06-29 10:35:52
5000
发布2020-06-29 10:35:52
举报

要求:给定1个字符串,比如ababc,要求找出“第1个最长的不重复子串”,即:"abc"

思路:遍历每个字符,寻找以它开头的不重复子串,遍历过程中,可以用一个Set作为缓冲区,存放曾经处理过的起始字符串。

过程:

(a)babc -> 子串为a

(ab)abc -> 子串为ab

(ab)abc -> 发现重复字符a,准备从第2个字符开始新一轮查找

a(b)abc -> 子串为b

a(ba)bc -> 子串为ba

a(ba)bc -> 发现重复字符b,准备第第3个字符开始新一轮查找

ab(a)bc -> 子串为a

ab(ab)c -> 子串为ab

ab(abc) -> 查找结束

代码:

代码语言:javascript
复制
    /**
     * 查找最长不重复子串
     *
     * @param s
     * @return
     */

    public String getFirstLongestSubstring(String s) {
        System.out.println(s);
        char[] arr = s.toCharArray();
        Set<Character> set = new HashSet<>();
        int right = -1, maxLen = -1;
        String subStr = "";
        for (int i = 0; i < arr.length; i++) {
            if (i > 0) {
                //缩小左边界
                set.remove(arr[i - 1]);
            }
            while (right + 1 < arr.length && !set.contains(arr[right + 1])) {
                set.add(arr[right + 1]);
                //扩大右边界
                right++;
            }
            int len = right - i + 1;
            if (len > maxLen) {
                maxLen = len;
                char[] temp = new char[maxLen];
                s.getChars(i, right + 1, temp, 0);
                subStr = new String(temp);
            }
            if (maxLen >= arr.length - i) {
                break;
            }
        }
        return subStr;
    }
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-06-26 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档