题意:给一字符串,求一个子串的长度,该子串满足所有字符都不重复。字符可能包含标点之类的,不仅仅是字母。按ASCII码算,就有2^8=128个。

思路:从左到右扫每个字符,判断该字符距离上一次出现的距离是多少,若大于max,则更新max。若小于,则不更新。每扫到一个字符就需要更新他的出现位置了。这里边还有个注意点,举例说明:

假如有长为16串 s="arbtbqwecpoiuyca"

当扫到第2个b时,距离上一个b的距离是2;(直接减)

当扫到第2个c时,距离上一个c的距离是6;(直接减)

但是!当扫到第2个a时,距离上一个a的距离是15,可是这串里面已经有b和c都有重复的了,是不符合的。真正的长 = 第2个a的位置 - 第1个c的位置。

假设当前扫到的字符为'A',其实求长的式子应该这样的:len = i - max(cur,pos[A])

这里的cur是指一个字符的位置,该字符是距离A最近的,并且在该字符与A之间还会出现该字符一次,(也就是在两个A之间,如果有出现次数为两次的字符,记录下第1个字符的位置,若多次出现,记录从右数第2次出现该字符的位置)这个cur的值要随时更新。

注:坑!这个算法的复杂度完全的O(n),实在强大。想了2天,我本来想到用哈希来做,感觉有点麻烦,一直在想更简单的,下面这个别人的代码实在简洁到没办法了,佩服。

 class Solution {
public:
int lengthOfLongestSubstring(string s) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
int locs[];//保存字符上一次出现的位置
memset(locs, -, sizeof(locs)); int idx = -, max = ;//idx为当前子串的开始位置-1
for (int i = ; i < s.size(); i++)
{
if (locs[s[i]] > idx)//如果当前字符出现过,那么当前子串的起始位置为这个字符上一次出现的位置+1
{
idx = locs[s[i]];
} if (i - idx > max)
{
max = i - idx;
} locs[s[i]] = i;
}
return max;
}
};

Longest Substring Without Repeating Characters

上面代码一字不差复制过来了。

最新文章

  1. web全栈开发之网站开发一(Mac环境配置)
  2. &lt;hr&gt;标签不止创建html水平线也可以画圆噢
  3. Mysql 学习笔记2
  4. SQL-语句实现九九乘法表
  5. 一些asp.net使用
  6. Bitnami Redmine安装和插件配置
  7. Linux 文件系统错误的修复方法 ddrescue替代dd的恢复软件 备用超级块
  8. 20160805_Cent6.4x64_安装配置(含网卡驱动的配置)
  9. 解北大OJ1088滑雪问题的记录
  10. Java之泛型练习
  11. ASP.Net IE10+ SCRIPT:XXX_doPostBack 未定义
  12. 使用Redis作为消息队列服务场景应用案例
  13. LED驅動芯片 兩種恒流控制方式
  14. 你好,C++(21)只要天还没黑,就一直在工地干活-4.3.1 while循环:只要…就一直…
  15. USACO Section 5.1 Musical Themes(枚举)
  16. FMS中的onStatus
  17. 自己动手编写IOC框架(四)
  18. dede list列表页和文章页分别使用if else
  19. 实验十一 团队作业7---团队项目设计完善&amp;编码测试
  20. 小程序实践(一):主页tab选项实现

热门文章

  1. How to install Samba server on Ubuntu 12.04
  2. 开源库ActiveAndroid + gson使用
  3. 拦截导弹 (NYOJ—79) 最长字串问题 (NYOJ—17)
  4. java多线程系列:ThreadPoolExecutor
  5. jeecms v8 网站访问量配置
  6. js常用util
  7. 浅谈.net的后台校验
  8. python-django框架中使用七牛云
  9. iOS通过SocketRocket实现websocket的即时聊天
  10. EOS 多主机多节点配置终极命令