您的位置:首页 > 其它

LCP003 LeetCode 3. Longest Substring Without Repeating Characters

2016-06-08 14:07 381 查看

前言

hash表~~

two pointers

题目

Acceptance : 22.3% Difficulty : Medium

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.

Tags Hash TableTwo PointersString

题解

拿到这个题的时候比较早了,但是因为没系统地学过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之前的位置的后一位即可。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: