题意:

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. (Medium)

解法1

自己开始AC的想法,用两重循环,搜索以s[i]开头的字串中的最长无重字串,所以一旦有重复元素出现(利用letters判重),内层的循环就可以直接跳出;

复杂度不会超过O(256(n)),因为内层最对走256步必有重复,可以不再走下去。 时间跑出来是60ms

代码1:

 class Solution {
public:
int lengthOfLongestSubstring(string s) {
int result = ;
int letters[] = {};
int tempResult;
for (int i = ; i < s.size(); ++i) {
if (i + result >= s.size()) {
break;
}
tempResult = ;
memset(letters, , sizeof(letters));
letters[s[i]] = ;
for (int j = i + ; j < s.size(); ++j) {
if (letters[s[j]] == ) {
tempResult++;
letters[s[j]] = ;
}
else {
break;
}
}
result = max(result, tempResult);
}
return result;
}
};

解法2

滑动窗口方法

用left记录当前考察的可行字串的最左端,i循环遍历整个字串。

如果遇到不重复元素,则添加进hash表内,并更新最大值;

如果遇到重复元素,将left开始递增,直至跳过重复元素,然后同上操作,将该元素添加进hash表,并更新最大值。

代码2利用unodered_set实现(估计find方法效率又低了,只有72ms), 代码3利用单独开的数组实现,效率更高(16ms)。

盗用网上一幅图,出处不详...

复杂度O(2n) = O(n) ;   left,i各自遍历一遍O(2n)

代码2:

 class Solution {
public:
int lengthOfLongestSubstring(string s) {
unordered_set<char> hash;
int left = ;
int result = ;
for (int i = ; i < s.size(); ++i) {
if (hash.find(s[i]) != hash.end()) {
while (s[left] != s[i]) {
hash.erase(s[left]);
left ++;
}
hash.erase(s[left]);
left ++;
}
hash.insert(s[i]);
result = max(result, i - left + );
}
return result;
}
};

代码3:

 class Solution {
public:
int lengthOfLongestSubstring(string s) {
int letters[] = {};
int left = ;
int result = ;
for (int i = ; i < s.size(); ++i) {
if (letters[s[i]] != ) {
while (s[left] != s[i]) {
letters[s[left]] = ;
left ++;
}
letters[s[left]] = ;
left ++;
}
letters[s[i]] = ;
result = max(result, i - left + );
}
return result;
}
};

解法3

解法3是在2的基础上的一个简单优化, letters数组只用来保存存在与否有些浪费,同时用while循环递增left找到重复元素出现位置下一位效率略低;

可以将letters数组改为存储某个字符最近出现的位置lastIndex[256],这样更新left时,直接将left = lestIndex[s[i]] + 1即可, 将 O(2n)变为真正的一次循环 O(n)

代码4:

 class Solution {
public:
int lengthOfLongestSubstring(string s) {
int lastIndex[]; // 上次出现该字符的下标
int left = ; //当前维护的字串的最左端
int result = ;
memset(lastIndex, -, sizeof(lastIndex));
for (int i = ; i < s.size(); ++i) {
if (lastIndex[s[i]] >= left) { //在这个字串内有重复 >= left
left = lastIndex[s[i]] + ;
}
lastIndex[s[i]] = i;
result = max(result, i - left + );
}
return result;
}
};

LeetCode3 Longest Substring Without Repeating Characters的更多相关文章

  1. Leetcode3:Longest Substring Without Repeating Characters@Python

    Given a string, find the length of the longest substring without repeating characters. Examples: Giv ...

  2. 最长子串(Leetcode-3 Longest Substring Without Repeating Characters)

    Question: Given a string, find the length of the longest substring without repeating characters. Exa ...

  3. 滑动窗口解决最小子串问题 leetcode3. Longest Substring Without Repeating Characters

    问题描述: Given a string, find the length of the longest substring without repeating characters. Example ...

  4. Leetcode3.Longest Substring Without Repeating Characters无重复字符的最长字串

    给定一个字符串,找出不含有重复字符的最长子串的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 无重复字符的最长子串是 "abc",其长度为 ...

  5. LeetCode3:Longest Substring Without Repeating Characters

    题目: Given a string, find the length of the longest substring without repeating characters. For examp ...

  6. [Swift]LeetCode3. 无重复字符的最长子串 | Longest Substring Without Repeating Characters

    Given a string, find the length of the longest substring without repeating characters. Examples: Giv ...

  7. LeetCode[3] Longest Substring Without Repeating Characters

    题目描述 Given a string, find the length of the longest substring without repeating characters. For exam ...

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

    Given a string, find the length of the longest substring without repeating characters. For example, ...

  9. Longest Substring Without Repeating Characters

    Given a string, find the length of the longest substring without repeating characters. Examples: Giv ...

随机推荐

  1. koa 笔记 运行错误

    按照 演示的代码 直接运行会出错,大家需要调整方式. http://koajs.cn/ 要安装以下 $ npm install -g n$ n 0.11.12$ node --harmony my-k ...

  2. HDU 5862 Counting Intersections (树状数组)

    Counting Intersections 题目链接: http://acm.split.hdu.edu.cn/showproblem.php?pid=5862 Description Given ...

  3. Mongo技巧-连接数据库与修改表结构

    1. 连接非本机数据库 mongo.exe之后直接输入ip地址即可 mongo.exe 192.168.163.203 2. 修改表结构 mongo里面没有表结构这个概念,现在采用类似关系型数据库的形 ...

  4. 用python实现远程复制 (scp + expect )

    scp 功能很强大,但需要人工输入 password, 当然可以通过把 公钥保存在远程主机的 ~/.ssh 目录中,而后就不用输入password,但这需要配置. 用 sshpass 可能在命令输入 ...

  5. Android打开WIFI或者移动网络的代码实现

    MainActivity如下: package wy.testnetwork; import java.lang.reflect.Field; import java.lang.reflect.Inv ...

  6. typedef block

    给同一种类型的block定义一个别名 typedef int (^MyBlock) (int , int); int main(int argc, const char * argv[]) { @au ...

  7. Linux coredump

    前面写过通过注册信号处理函数定位SEGV问题.其实Linux coredump机制也是比较好的debug手段. 进程由于某种异常或者bug导致在运行过程中异常退出或者中止,有时会产生一个叫做core的 ...

  8. 查看大图 zoomImage

    添加引用 <link rel="stylesheet" media="screen" type="text/css" href=&qu ...

  9. android AsyncHttpClient 开源框架的使用

    AsyncHttpClient 1.在很多时候android都需要进行网络的操作,而android自带的HttpClient可以实现,但要进行很多网络连接的时候(如:下载很多图片),就需要线程池来进行 ...

  10. 使用java实现持续移动的小球

    原创作品,可以转载,但是请标注出处地址http://www.cnblogs.com/V1haoge/p/5559829.html 仅为自己学习作品,使用java的JFrame框架实现持续移动的小球. ...