给定一个字符串,返回字符串中没有重复字符的最长子串的长度

本文介绍了一种用于寻找字符串中最长无重复字符子串的算法实现。通过遍历字符串并检查每个字符来确定最长不包含重复字符的子串长度。此算法适用于字符串操作和基本的数据结构练习。
public class MainTest {

    /**
     * @param args
     */
    public static void main(String[] args) {

        String[]ss = {"","a","ab","abc","abcbba","abcdefgabc","abcdabcdef"};
        for(String s : ss){
            System.out.println("s = " + s + "; noReapLength = " +                      maxStringNoRepeatLength(s));
        }

    }


    public static int maxStringNoRepeatLength(String s){

        if(s == null || s.length() == 0){return 0;}

        int start = 0;
        int maxLength = 1;

        for(int end = start + 1;end <= s.length() - 1;end++){
            int index = end - 1;
            int tempLength = 0;
            //检查有无重复
            while(index >= start){
                if(s.charAt(index) != s.charAt(end)){
                    index--;
                }else{
                    break;
                }
            }

            tempLength = end - start + 1;
            if(index >= start){//有重复
                start = index + 1;
                tempLength -= 1;
            }

            if(tempLength > maxLength){
                maxLength = tempLength;
            }       
        }

        return maxLength;
    }
}
### 算法思路 查找字符串重复字符最长的问题可以通过滑动窗口的方法来解决。滑动窗口是一种常用的双指针技巧,其中通过两个指针(左指针 `left` 和右指针 `right`)来动态调整窗口的范围,以找到满足条件的子。窗口内保证没有重复字符,并通过遍历整个字符串断更新窗口的大小,从而找到最长重复字符的子。 具体实现中,可以使用一个集合来记录当前窗口中已经出现的字符。当右指针向右移动时,如果发现当前字符已经在集合中,则需要移动左指针,直到窗口中再包含重复字符为止。同时,在每次移动右指针时,更新当前窗口的长度[^2]。 ### 代码实现 以下是一个 Python 实现的例子: ```python def length_of_longest_substring(s: str) -> int: char_set = set() left = 0 max_length = 0 for right in range(len(s)): while s[right] in char_set: char_set.remove(s[left]) left += 1 char_set.add(s[right]) max_length = max(max_length, right - left + 1) return max_length ``` 在上述代码中: - `char_set` 是一个集合,用于存储当前窗口中的字符。 - `left` 和 `right` 分别表示窗口的左右边界。 - `max_length` 用于记录遍历过程中找到的最长重复字符长度。 - 当遇到重复字符时,通过移动左指针 `left` 来收缩窗口,直到窗口中再包含重复字符。 - 每次右指针 `right` 移动时,都会尝试更新 `max_length` 的值。 ### 时间复杂度分析 该算法的时间复杂度为 $O(n)$,其中 $n$ 是字符串长度。每个字符多会被左指针和右指针各访问一次,因此整体效率较高。空间复杂度为 $O(m)$,其中 $m$ 是字符集的大小,集合存储的字符数量会超过字符集的大小[^2]。 ### 应用场景 滑动窗口方法仅适用于本题,还可以扩展到其他类似问题,例如: - 找出字符串中所有字母异位词的子。 - 小覆盖子问题。 - 找出最长重复字符替换后的子长度。 通过灵活调整窗口的扩展和收缩条件,滑动窗口方法可以高效解决一系列子相关的问题[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值