LeetCode3

时光总嘲笑我的痴心妄想 提交于 2020-02-06 01:10:07

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


问题描述:

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

  示例 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;
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!