LeetCode- 3. Longest Substring Without Repeating Characters


Description
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.

题目分析

对于一给定字符串,题目要求给出由互不相同的字母组成的子字符串的长度。
注意:这里的子字符串是指在原字符串中连续出现的字符串,而不是由字符串中各字母组成的子序列中。例如:

strs="pwwkew"
substring="wke";
subsequence="pwke"
length=3;

字符串strs中所有互不相同的元素组成的子字符序列(subsequence)
是”pwke”,然而,由于原字符串中字母’p’与’k’之间的’w’出现重复,因此其不属于子字符串。

解题思路

题目要求给出字符串的最长不重复子字符串的长度。题目可采用滑动窗口的方法来解决。
定义两个变量表示滑动窗的最前端(首位置)和最后端(末尾)。首位之间的字符串互不相同且连续,即最长不重复子字符串。因而,窗长度的最大值即为所求。
首先将窗的尾设定在字符串起始位置,首位置设为1。如果如果窗首位置的字符串与窗内字符串互不相同,则将窗首位置加一,继续与窗内字符比较;如果首位置字符与窗内内某一字符串相同,则需要将窗的尾位置移动到窗内与首位置字符相同的字符索引加一的位置(即该字符后一字符的位置)以保证窗内所有字符串互不相同并且连续。依次滑动窗,并记录滑动过程中窗的长度。窗长度的最大值即为所求最长不重复子字符串的长度。
特殊情况:
(1)空字符串,此时返回0;
(2)字符串长度为1,长度为1,不管是空格还是其他字符,其子字符串均为其本身,因此返回1。

C语言代码
int lengthOfLongestSubstring(char* s) {
int len=strlen(s);

if(len==0)              //长度为零,返回0;
    return 0;
if(len==1)              //长度为1,返回1.
    return 1;

int i=0,j=0,lls=1,k=0;  //i表示窗首首,j表示窗尾位置lls表示窗长度,i-j+1即为当前窗口的长度 
{

    for(k=j;k<i;k++)
        if(s[i]==s[k])
        {
            j=k+1;
            if((i-j+1)>lls)
                lls=i-j+1;

            break;
        }
    if(k==i&&(i-j+1)>lls)        //窗长度大于记录最大值,则更新。否则保持不变,
        lls=i-j+1;
}
return lls; 

}
“`
运行时间:15ms

Accepted Solutions Runtime Distribution.png

参考文献
[1] https://leetcode.com/problems/longest-substring-without-repeating-characters/#/description
[2] http://blog.csdn.net/fightforyourdream/article/details/17860983

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值