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

给定一个字符串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);

    }

}

最终结果:

时间: 2024-08-11 05:43:23

字符串问题之 找到字符串的最长无重复子串的相关文章

最长无重复子串的DP实现

这道题能算DP吗?那要看是否具备最优子结构.我的分析是没有明显的子结构性质. 例如当求下表为 i 的最长无重复子串时,要考虑两类情况. (1) s[ i ] 是否在字符串s之前的位置出现过,如果没有则长度 len++ : (2) 如果出现过,分两种情况讨论(是否出出现在当前处理的子串中)(len表示当前处理的子串的长度) a> 在.那好办,直接更新len = i -  (出现位置下标) : b>不在.更好办,直接更新 len++. 分析可见,并没有什么最优子结构,DP也谈不上吧. 数据结构:

python 实现最长无重复子串

eg: 输入:'a' 输出:1 输入:'aba' 输出:2 输入:'pwwag' 输出:3 # 最长无重复子串,注意是子串,不是所有的字符,也不是回文子串def demo(str): max_len=[] # 记录每次子串长度的值 e_len=0 #子串长度 dict={} #记录已经遍历过的元素 for i in range(len(str)): if str[i] not in dict: e_len += 1 dict[str[i]]=i max_len.append(e_len) els

字符串练习(八):最长无重复字符子串

对于一个字符串,请设计一个高效算法,找到字符串的最长无重复字符的子串长度. 给定一个字符串A及它的长度n,请返回它的最长无重复字符子串长度.保证A中字符全部为小写英文字符,且长度小于等于500. 测试样例: "aabcb",5 返回:3 public class DistinctSubstring { public int longestSubstring(String A, int n) { // write code here if(A==null || n==0){ return

[LeetCode] Longest substring without repeating characters 最长无重复子串

Given a string, find the length of the longest substring without repeating characters. For example, the longest substring without repeating letters for "abcabcbb" is "abc", which the length is 3. For "bbbbb" the longest subst

字符串空格替换、合法括号序列判断、求最长无重复子串问题

一:字符串空格替换 将字符串中的空格全部替换为"%20".假定该字符串后面有足够的空间存放新增的字符. 如:Mr John Smith->Mr%20John 陷阱:Java玩家可能第一时间想到用split(" ")分割原字符串,然后重新拼接的时候在词间添加"%20".这种思路的不完善之处在于:如果原字符串以空格结尾.或者单词之间不止一个空格,则会导致拼接出来的字符串不符合要求. 解法:该题说明原字符串后面有足够空间(Java玩家可忽略,因为

[LeetCode] Longest Substring Without Repeating Characters最长无重复子串

Given a string, find the length of the longest substring without repeating characters. For example, the longest substring without repeating letters for "abcabcbb" is "abc", which the length is 3. For "bbbbb" the longest subst

最长无重复子串的简单实现

最简单实现的必须要搞定,之后再说更高级的办法. 程序如果总是bug,不是你的问题,你只是需要一个break,否则就会一直呆在bug的死循环中. 解决问题最好的办法一定不是死磕到底,而是要学会放一放但不要放到遗忘,而要等待时机卷土重来. int lengthOfLongestSubstring(string s) { if(s=="") return 0; int maxs(-1),cnt; array<int,256> mp;//c++11,need more insigh

查找字符串中最长无重复字符的子串

设定一个当前子字符串:tempString 设定一个保持最长无重复子串的数组:list 思路: 从第一个字符开始判断, 如果当前子串不包括当前的字符,则当前子串加入当前的字符成为新的当前子串, 如果当前子串包括当前的字符,判断当前字符在当前字符串中的位置,根据这个位置把字符串分成两个字符串,如果后面一个末尾加当前字符为新的当前子字符串,判断当前子串跟list数组中的子串长度,如果当前子串长,则清空list,把当前子串加入:如果相等,直接将当前子串加入list. 最后list的中的子字符串就是最长

Longest Substring Without Repeating Characters 字符串中最长的无重复子串长度

Longest Substring Without Repeating Characters Given a string, find the length of the longest substring without repeating characters. For example, the longest substring without repeating letters for "abcabcbb" is "abc", which the lengt