字符串问题之 找到字符串的最长无重复子串长度

本文介绍了一种求解字符串中最长无重复字符子串长度的高效算法,采用时间复杂度O(N)和空间复杂度O(M)的方法,通过记录每个字符最后出现的位置来更新最长子串的长度。

字符串问题之 找到字符串的最长无重复子串长度

给定一个字符串str, 返回str的最长无重复字符子串长度

例如 str="abcd' 返回4

      str=“aabcb” 最长“abc” 返回3

 

解决本题的思路非常非常有趣,这种思路必须要学会:

本题目可以做到  时间复杂度O(N)  str长度N     空间复杂度O(M)  M是字符编码

 根据字符编码 大小 申请 map  key表示字符  value表示最近出现的位置

                                 int pre 遍历到的字符str[i] 以为str[i]结尾的最长无重复字符子串开始位置的前一个位置 初始时候 pre=-1;

                                int len 记录以每一个字符结尾的情况下 最长的长度 初始len=0

 

package TT;



public class Test6 {
  
    public static int maxUnique(String str){
        if(str==null || str.equals("")){
            return 0;
        }
        
        char[] chas = str.toCharArray();
        int[] map = new int[256];
        for(int i =0; i<256; i++){
            map[i]=-1;
        }
        
        int len =0;
        int pre = -1;
        int cur=0;
        for(int i =0; i!=chas.length; i++){
            
            pre = Math.max(pre, map[chas[i]]);
            cur = i-pre;
            len = Math.max(len, cur);
            map[chas[i]]=i;   
        }
        return len;
    }
    public static void main(String[] args){
        
        String aa = "abcd";
        int x = maxUnique(aa);
        System.out.println(x);
        
    }
}

最终结果:

 也可以这么玩儿:

public class Test7 {
    public static int getLangest(String str) {
        HashMap<Character, Integer> hashMap = new HashMap<>();
        int lastPosition = str.length() - 1;
        int length = 0;
        int repeatPosition = 0;
        for (int i = 0; i < str.length(); i++) {
            Character now = str.charAt(i);
            if (!hashMap.containsKey(now)) {
                hashMap.put(now, i);
                length = (i - repeatPosition) > length ? (i - repeatPosition) : length;
            } else {
                repeatPosition = i;
                if (i == lastPosition) {
                length = (i - repeatPosition) > length ? (i - repeatPosition) : length;
                }
                length = (i - hashMap.get(now)) > length ? (i - hashMap.get(now)) : length;
            }

        }
        return length+1;

    }

    public static void main(String[] args) {
        String str = "aabcbrmnv";
        System.out.println(getLangest(str));
    }
}

 这么玩儿:

public class Test8 {

    public static int getLongest(String str) {

        char[] strArr = str.toCharArray();
        
        int[] arr = new int[256];  //申请数组并初始化为0
        for(int i=0; i<arr.length; i++) {
            arr[i]=-1;
        }
        
        int resLength = 0;  //返回的长度
        int pre = -1;  //数组左边的以为哈哈哈哈
        for (int i = 0; i < strArr.length; i++) {
            
            char now = strArr[i];
            pre = arr[now] > pre ? arr[now] : pre;
            resLength = (i - pre) > resLength ? (i-pre) :  resLength;
            arr[now]=i;
                      
    
        }
        
        return resLength;
    }

    public static void main(String[] args) {
        String str = "aabcbrmnv";
        System.out.println(getLongest(str));
    
    }
}

 

posted @ 2017-08-22 11:24 toov5 阅读( ...) 评论( ...) 编辑 收藏
### 3.1 最长无重复字符子字符串的计算方法 在字符串处理中,查找一个字符串最长的不含重复字符的子字符串是常见的问题之一。这一问题可以通过滑动窗口法高效解决,其核心思想是维护一个窗口,以确保窗口内的字符始终唯一,并通过移动窗口的位置来逐步找到最长无重复字符串。 #### 滑动窗口算法原理 滑动窗口算法利用两个指针(通常称为左指针 `left` 和右指针 `right`)来表示当前窗口的范围。右指针用于扩展窗口,而左指针则根据字符是否重复进行调整。具体实现中,可以使用哈希表或集合来记录窗口内已经出现的字符及其位置。 #### 算法实现 以下是一个基于滑动窗口思想的 Java 实现: ```java import java.util.HashMap; import java.util.Map; public class Solution { public int lengthOfLongestSubstring(String s) { Map<Character, Integer> map = new HashMap<>(); int maxLength = 0; int left = 0; // 左指针 for (int right = 0; right < s.length(); right++) { char currentChar = s.charAt(right); if (map.containsKey(currentChar) && map.get(currentChar) >= left) { left = map.get(currentChar) + 1; // 更新左指针位置 } map.put(currentChar, right); // 更新字符的新位置 maxLength = Math.max(maxLength, right - left + 1); // 计算长度 } return maxLength; } public static void main(String[] args) { Solution solution = new Solution(); System.out.println(solution.lengthOfLongestSubstring("abcdbefdn")); // 输出: 5 } } ``` 该算法的时间复杂度为 O(n),其中 n 是字符串长度。由于每个字符多只会被访问两次(一次由右指针访问,一次由左指针访问),因此效率较高。 #### 算法优化与改进 上述实现通过哈希表记录字符的位置,从而避免了重复遍历字符串问题。此外,还可以进一步优化代码逻辑,例如减少不必要的条件判断和变量更新,提高代码的可读性和执行效率。 ### 3.2 算法应用场景 最长无重复字符子字符串的计算广泛应用于文本处理、数据去重以及密码学等领域。例如,在密码强度检测中,可以通过计算最长无重复字符子字符串长度来评估密码的复杂性;在自然语言处理中,该算法可用于识别句子中的独特词汇序列。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值