LCP003 LeetCode 3. Longest Substring Without Repeating Characters
2016-06-08 14:07
381 查看
前言
hash表~~two pointers
题目
Acceptance : 22.3% Difficulty : MediumGiven 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.
Tags | Hash Table | Two Pointers | String |
题解
拿到这个题的时候比较早了,但是因为没系统地学过hash table,所以先看了几个similar problems,搞定之后又回来看这道题。感觉只考虑hash table是解决不了问题的,结合另一个Tag Two Pointers。想到一种方法。快慢指针。
hash table 中存储某一character的位置信息,快指针向前遍历,当它指向的char在表中的位置信息为有效值(记为p)时,说明开始重复了。于是慢指针指向p后面一个位置p+1,并将p+1之前的char在表中的位置信息置为无效值。
当然,慢指针在运动之前需要先计算目前快慢指针之间的距离,也就是当前无重复字符的字符串的长度。再判断它与之前记录的最长无重复字符串的长度大小,以确定是否以之替换掉当前记录。
AC Code
蹩脚的代码beats 64.6%
class Solution { public: int lengthOfLongestSubstring(string s) { int i = 0, j = 1, maxLength = 0; int charPos[127] = {0}; for(; i < s.size(); i++) { if (charPos[s[i]] > 0) { if (i - j + 1 > maxLength) maxLength = i - j + 1; for (; j < charPos[s[i]] + 1; j++) charPos[s[j - 1]] = 0; } charPos[s[i]] = i + 1; } if (i - j + 1 > maxLength) return i - j + 1; return maxLength; } }
说它蹩脚,是因为没找到将127个int初始化为-1的方法。(循环赋值除外)。于是便以0为无效值,这样的话,左数第一位的位置信息就必须记为1了。而在string数组中,左数第一位的游标为0,于是便出现了到处的+1 和 -1 操作。显得很混乱。利用vector或循环赋值为-1后,代码略清晰些。
Clearer Code Beats 53.11%
class Solution { public: int lengthOfLongestSubstring(string s) { int i = 0, j = 0, maxLength = 0; vector<int> map(256, -1); for (; i < s.size(); i++) { if (map[s[i]] > -1) { if (i - j > maxLength) maxLength = i - j; for (; j <= map[s[i]] + 1; j++) map[s[i]] = -1; } map[s[i]] = i; } if (i - j > maxLength) return i - j; return maxLength; } }
Discussion
看Discussion中的代码时发现,其实没必要判断map[s[i]]是否是有效值并且还要把 j 到map[s[i]] + 1的表值修正为无效值。直接判断map[s[i]]是否在 j 的右侧,即 if (map[s[i]] >= j),来判断这个i所指的char在i之前,j及j之后是否还有这样的char。
并直接将j指向i所指的char在i之前的位置的后一位即可。
相关文章推荐
- Windows:文件服务器,访问进去不能查看到完整的文件
- 学习网站 - URLs
- 安装python的pip相关
- 数据集成之主数据管理
- 安全牛尊享技术会员开始招募
- KMeans聚类算法Hadoop实现
- Red5连接时错误:NetConnection.Connect.Failed
- Ubuntu 14.04 LTS 下升级 gcc 到 gcc-4.9、gcc-5版本
- java.lang.OutOfMemoryError: unable to create new native thread
- WGS84,GCJ02, BD09坐标转换
- spring定时器分析
- 详解android:scaleType属性
- ScrollView中嵌套 GridView 导致 ScrollView默认不停留在顶部的解决方案和分析
- 第八周项目二—学生类
- oracle中数据库自增列实现
- 【Unity】批量处理Unity中的图片资源
- XCode 7.3.1(dmg) 官方直接下载地址(离线下载)
- Func
- EMI Music Data Science Hackathon冠军团队的技术报告
- dedecms如何在文章列表前加上序列号