您的位置:首页 > 其它

Leetcode 3. Longest Substring Without Repeating Characters

2016-08-24 17:22 387 查看


题意:求字符串中的最长非重复子串

思路 :用O(n)即可
要求知道每次字符的上一次出现的位置
例如
0  1  2  3  4  5
a  a  b  c  b  c
首先将每个字符的上次位置初始化为-1,左边界left设为0,当前子串长度now_sum为0
遍历过程:
i=0:  a的上次位置为-1,小于边界0,故now_sum加1。同时a的上次位置变成0
i=1:  a的上次位置为0,大于等于边界0,所以再利用原边界将出现重复。故先计算now_sum与ans的大小,接着再重置now_sum为当前位置减上次位置。最后再把左边界设为上次位置+1,即为1
i=2 : now_sum++
i=3: now_sum++
i=4:发现b的上次位置为2,大于边界1,故ans变成3,同时左边界变成3.
……同理

class Solution {
public:
int lengthOfLongestSubstring(string s) {
int last_char[250],left,ans,i,n,c,now_sum;
for(i=0;i<250;i++)
last_char[i]=-1;
left=0;
ans=0;
now_sum=0;
n=s.length();
for(i=0;i<n;i++)
{
c=s[i];//字符ASCII码
if(last_char[c]>=left) //若上一个同字符位置大于等于左边界,则修改边界
{
if(now_sum>ans)
ans=now_sum;
now_sum=i-last_char[c]; //新的now_sum值为当前位置减去上一个字符位置
left=last_char[c]+1; //边界为上一个字符位置+1
}
else
{
now_sum++;
}

last_char[c]=i; //此字符的上一个位置
}
if(now_sum>ans)
ans=now_sum;
return ans;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: