您的位置:首页 > 编程语言

最简洁的代码 求字符串中无重复的子串

2017-03-29 17:11 197 查看
这道 题是leetcode 上面的 一道题。常规解法需要两层循环。这种解法不仅代码简洁,而且只需要一层循环。降低了复杂度。一起欣赏一下作者的代码。

原题:

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 of 1.

Given
"pwwkew"
, the answer is
"wke"
, with the length of 3. Note that the answer must be a
substring,
"pwke"
is a subsequence and not a substring.

解法:

/**

* Solution (DP, O(n)):

*

* Assume L[i] = s[m...i], denotes the longest substring without repeating

* characters that ends up at s[i], and we keep a hashmap for every

* characters between m ... i, while storing <character, index> in the

* hashmap.

* We know that each character will appear only once.

* Then to find s[i+1]:

* 1) if s[i+1] does not appear in hashmap

*    we can just add s[i+1] to hash map. and L[i+1] = s[m...i+1]

* 2) if s[i+1] exists in hashmap, and the hashmap value (the index) is k

*    let m = max(m, k), then L[i+1] = s[m...i+1], we also need to update

*    entry in hashmap to mark the latest occurency of s[i+1].

*

* Since we scan the string for only once, and the 'm' will also move from

* beginning to end for at most once. Overall complexity is O(n).

*

* If characters are all in ASCII, we could use array to mimic hashmap.

*/

实现代码:简直简洁有木有!!!

/**
* Solution (DP, O(n)):
*
* Assume L[i] = s[m...i], denotes the longest substring without repeating
* characters that ends up at s[i], and we keep a hashmap for every
* characters between m ... i, while storing <character, index> in the
* hashmap.
* We know that each character will appear only once.
* Then to find s[i+1]:
* 1) if s[i+1] does not appear in hashmap
* we can just add s[i+1] to hash map. and L[i+1] = s[m...i+1]
* 2) if s[i+1] exists in hashmap, and the hashmap value (the index) is k
* let m = max(m, k), then L[i+1] = s[m...i+1], we also need to update
* entry in hashmap to mark the latest occurency of s[i+1].
*
* Since we scan the string for only once, and the 'm' will also move from
* beginning to end for at most once. Overall complexity is O(n).
*
* If characters are all in ASCII, we could use array to mimic hashmap.
*/

int lengthOfLongestSubstring(string s) {
// for ASCII char sequence, use this as a hashmap
vector<int> charIndex(256, -1);
int longest = 0, m = 0;

for (int i = 0; i < s.length(); i++) {
m = max(charIndex[s[i]] + 1, m); // automatically takes care of -1 case
charIndex[s[i]] = i;
longest = max(longest, i - m + 1);
}

return longest;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: