编程练习:无重复字符的最长字串

题目LeetCode-无重复字符的最长字串

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

  • 示例1
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
  • 示例2
输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。

分析与实现

解法一
  • 分析
    这里面的难度在于,从i开始遍历,遇到相同字符后结束,记录长度。然后从i+1开始继续遍历
  • 实现(java)
/**
     * 求不出现重复的最大字串的长度
     * @param s 源串
     * @return 长度值
     */
    public static int lengthOfLongestSubstring(String s) {

        if (s.length() < 2) {
            return s.length();
        }

        int maxLen = 0;
        List<Character> list = new ArrayList<>();
        for (int i = -1; i < s.length(); i++){
            list.clear(); // 每次清空map
            //list.add(s.charAt(i));
            for (int j = i+1; j < s.length(); j++) {
                Character c = s.charAt(j);
                if (!list.contains(c)){
                    list.add(c);
                }else{
                    // 说明存在了
                    break;
                }
            }
            if (list.size() > maxLen) {
                maxLen = list.size();
            }
        }
        return maxLen;
    }

这里使用了list作为字串的存储,主要是便于判断字符的存在情况,用了两次for循环

这样做的确可以达到效果,但是时间复杂度很大,提交结果如下

解法二

-分析
在每一次遍历到一个重复的字符时,其实在这之前的所有字符已经遍历,那么应该可以直接拿来用,所以这里分为三种情况:

  1. 情况1: 重复字符出现在子串的第一位;
  2. 情况2: 重复字符出现在子串的中间;
  3. 情况3: 重复字符出现在子串的最后;

关于这三种情况的处理详细见下面的代码中的注释分析:

  • 实现(java)
if (s.length() < 2) {
            return s.length();
        }
        int maxLen = 0;
        List<Character> list = new ArrayList<>();
            for (int j = 0; j < s.length(); j++) {
                Character c = s.charAt(j);
                if (!list.contains(c)){
                    list.add(c);
                }else{
                    int index = list.indexOf(c); // 得到列表中该字符的下标
                    /*
                        1. 如果下标在最开始
                           判断list的size和max的大小
                           将第一个remove掉
                           将新的字符加入list
                     */
                    if (index == 0){
                        if (list.size() > maxLen) {
                            maxLen = list.size();
                        }
                        list.remove(0);
                    }
                    /*
                        2. 如果下标在最中间
                           判断前面部分的长度是否大于当前的maxlen,如果是修改maxlen
                           将index出之前(包括index出的字符)删除
                           将j处的字符加入list
                     */
                    else if (index != 0 && index != (list.size() - 1)) {
                        if (list.size() > maxLen) {
                            maxLen = list.size();
                        }
                        for (int i = 0; i < index + 1; i++) {
                            list.remove(0); // 移除index+1次;list的remove问题
                        }
                    }
                    /*
                        3. 如果下标在最最后
                           判断size和maxlen的大小
                           清除list中所有的元素
                           将j处的字符加入
                     */
                    else {
                        if (list.size() > maxLen) {
                            maxLen = list.size();
                        }
                        list.clear();
                    }
                    list.add(c);
                }
            }

            if (list.size() > maxLen) { // 判断最后list中的字串长度
                maxLen = list.size();
            }
        return maxLen;

这样处理后,在时间复杂度上好了很多!

当然LeetCode上还有很多大佬的实现,时间复杂度还要低,但是思想都是重复利用遍历过序列

最后

此致,敬礼!

原文地址:https://www.cnblogs.com/numen-fan/p/10513613.html

时间: 2024-10-02 10:26:15

编程练习:无重复字符的最长字串的相关文章

leetcode无重复字符的最长字串 python实现

无重复字符的最长字串是一道字符串处理算法的题目,在日常编程中,处理字符串是常见任务.用Python来实现leetcode这道算法题,该题目会涉及到一个概念"滑动窗口". 一.题目描述 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度(Longest substring without repeating characters). 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所

无重复字符的最长字串问题

leetcode3:无重复字符的最长字串问题 问题描述 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb"输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3.示例 2: 输入: "bbbbb"输出: 1解释: 因为无重复字符的最长子串是 "b",所以其长度为 1.示例 3: 输入: "pwwkew"输出: 3 这道题,我自己的

【leetcode算法-中等】3. 无重复字符的最长字串

[题目描述] 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb"输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3.示例 2: 输入: "bbbbb"输出: 1解释: 因为无重复字符的最长子串是 "b",所以其长度为 1.示例 3: 输入: "pwwkew"输出: 3解释: 因为无重复字符的最长子串是 "wke&qu

无重复字符的最长字串

题目描述: 给定一个字符串,找出不含有重复字符的最长子串的长度. 示例: 给定 "abcabcbb" ,没有重复字符的最长子串是 "abc" ,那么长度就是3. 给定 "bbbbb" ,最长的子串就是 "b" ,长度是1. 给定 "pwwkew" ,最长子串是 "wke" ,长度是3.请注意答案必须是一个子串,"pwke" 是 子序列 而不是子串 思路: 假设字符串为

[leetcode]3无重复字符的最长字串

本题思路较清楚,通过一个数组记录各个位置所能够引导的最长字符串的长度即可. 稍微有一点难度在于如何向前寻找时判断已经出现了重复字符串,我采用的思路为只有当前项的长度等于当前长度时,认为尚未出现重复字符串,并更新前项长度++. 1 int max=0; 2 int st[100000]={0};//表示以它为开头的最长不重复字串长度 3 int i=0; 4 char p; 5 while(s[i]!='\0') 6 { 7 p=s[i]; 8 st[i]=1; 9 max=st[i]; 10 f

Longest Substring Without Repeating Characters,求没有重复字符的最长字串

问题描述: Given a string, find the length of the longest substring without repeating characters. Examples: Given "abcabcbb", the answer is "abc", which the length is 3. Given "bbbbb", the answer is "b", with the length

QA:无重复字符的最长子串

无重复字符的最长字串 leetcode地址:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/ 题目描述: 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例: 输入: "abcabcbb" 输出: 3 解决思路: 使用map  lastOccured[byte]int 记录字符和字符最后出现的下标 对于字符串每个字符x: 1.lastOccured[x]不

【Leetcode】【Longest Substring Without Repeating Characters】【无重复字符的最长子串】【C++】

题目:给定一字符串,求其无重复字符的最长子串长度. 思路:for循环一次,时间复杂度为O(N).字符的ascii值为32~126.start表示当前无重复字符子串的初始位置,初始值为0:可定义一个位置数组pos[128]表示for循环索引到当前位置时相应的字符对应的位置.若当前字符s[i](其ascii值为cur_pos),若pos[cur_pos]>=start,说明在start之后已有该字符s[i],则以start开始的子串第一次遇到重复字符,打住.判断当前长度是否大于max_len,若大于

代码题(56)— 最长重复子串、无重复字符的最长子串

1.最长的重复子串 寻找一个字符串中最长的重复子串 最大后缀方法思路: 1. 用字符串指针数组保存用户输入的字符串的所有后缀字符串: 2. 将后缀字符串集合进行排序: 3. 比较相邻字符串的公共子串长度,找到长度最大值,保存相应字符串即为所求 空间复杂度:求长度为n的字符串的后缀,需要O(n)的空间复杂度  时间复杂度:产生后缀数组-时间复杂度O(N).对后缀数组排序是O(N*NlogN),第一个N表示字符串的比较,后面NlogN使用快排排序.依次检测相邻两个后缀的公共长度-时间复杂度O(N*N