LeetCode3

如果饿了就吃,困了就睡,渴了就喝,人生就太无趣了


题源:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/

问题描述:

给定一个字符串,请你找出其中不含有重复字符的最长子串的长度。

  示例 1:   
  输入: "abcabcbb"   
  输出: 3   
  解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。     
      
  示例 2:    
  输入: "bbbbb"     
  输出: 1     
  解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。   
    
  示例 3:    
  输入: "pwwkew"      
  输出: 3     
  解释: 因为无重复字符的最长子串是?"wke",所以其长度为 3。   

解题思路

1.如图1:初始状态,入参字符串指针s。字符串指针pflag。计数器sum。变量maxlong记录最长的长度,没在图中显示。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OqhCSrWM-1580868149913)(3-1.png '图1')]

2.指针s每次循环自增,计数器sum=1。在指针s的每次循环中,指针flag记录指针p的起始位置,p通过循环每次自增+1,比较与s位置的值是否相同,不相同计数器+1。p每次移动到与s相差1个距离就结束。将summaxLong相比较,若是比maxLong大,将值赋给maxLong。在将p移动到flag的位置,准备下一次s的循环。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-okvVI7Fq-1580868149914)(3-2.png '图2')]

3.若是在p移动的过程中,p所在位置值与s所在位置的值相同,就将flag移动到p后边的一个位置。并将sum置1。s本次循环结束后,将p移动到flag的位置,准备下一次s的循环。
在这里插入图片描述

代码实现

int lengthOfLongestSubstring(char *s) {
    int maxLong = 1;

    char *p = s;
    char *flag = s;
    if (*s == '\0')
        return 0;
    s++;
    for (; *s != '\0';) {
        int sum = 1;
        for (; p != s;) {
            if (*p != *s) {
                sum++;
                p++;
            } else {
                sum = 1;
                p++;
                flag = p;
                break;
            }
        }
        if (sum > maxLong) {
            maxLong = sum;
        }

        p = flag;
        s++;
    }

    return maxLong;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值