最长无重复子串的DP实现

这道题能算DP吗?那要看是否具备最优子结构。我的分析是没有明显的子结构性质。

例如当求下表为 i 的最长无重复子串时,要考虑两类情况。

(1) s[ i ] 是否在字符串s之前的位置出现过,如果没有则长度 len++ ;

(2) 如果出现过,分两种情况讨论(是否出出现在当前处理的子串中)(len表示当前处理的子串的长度)

a> 在。那好办,直接更新len = i -  (出现位置下标) ;

b>不在。更好办,直接更新 len++。

分析可见,并没有什么最优子结构,DP也谈不上吧。

数据结构:

可采用C++11的unordered_map,这个可以再常数时间内找到某个元素(map的红黑树实现需要logn),但是否足够好?不然,数组更好,高级一点可用C++11的Array,还不用处理HASH冲突。所有的字符不过256而已。空间、时间都是一流的。

需要注意的用数组,一要清0,二要主要下标操作。下标不能从1开始,否则就无法判断第一个元素是否出现,会被默认为没有出现。举个例子:abcdaefghi,如果下标从0那么a的重复就不会发现,你得到的是整个序列的长度。

上篇的1000多个测试用例的时间为380MS,这里的为144MS,节省了一半还多。

int lengthOfLongestSubstring(string s) {
        if(s=="") return 0;
        array<int,256> map;
        map.fill(0);
        int len=0,maxLen=0;

        for(int i=0 ; i<s.size();++i){
        	if(map[s[i]]==0||i+1-len>map[s[i]]) // index should plus 1 to avoid 0 index
        		len++;
        	else len = i+1-map[s[i]];<span style="white-space:pre">	</span>// same reason
        	map[s[i]]=i+1; <span style="white-space:pre">			</span>//start from 1
        	maxLen=max(len,maxLen);
        }
        return maxLen;
    }
时间: 2024-10-07 02:28:48

最长无重复子串的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

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

给定一个字符串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]结尾的最长无重复字符子串开

[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

[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

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

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

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

算法--最长无重复字符子串

转载请标明出处http://www.cnblogs.com/haozhengfei/p/d0906ebc98f7b6eaecb3ecd738dc78ac.html 最长无重复字符子串练习题 最长无重复字符子串练习 第12节 最长无重复字符子串练习题 对于一个字符串,请设计一个高效算法,找到字符串的最长无重复字符的子串长度. 给定一个字符串A及它的长度n,请返回它的最长无重复字符子串长度.保证A中字符全部为小写英文字符,且长度小于等于500. 测试样例: "aabcb",5 返回:3 J

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

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