最长无重复字符串的长度(暴力法)

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

示例 1:

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

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

输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
  请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

题解

/* 
最长无重复字符串的长度
 */
int lengthOfLongestSubstring(char * s){//暴力法
    int len=strlen(s);//获取字符串长度
    if(!len)//如果len为0,就返回0
    {
        return 0;
    }
    else if(len==1)//如果len=1,返回1
    {
        return 1;
    }
    else
    {
        int start=0,end=1;
        int i;
        int max_len=1,cur_len=1;//最大长度,当前的长度
        char temp_char;
        while (end<len)
        {
            temp_char=s[end];
            for(i=start;i<end;i++)
            {
                if(s[i]==temp_char)
                {
                    cur_len=end-start;
                    if(cur_len>max_len)
                    {
                        max_len=cur_len;
                    }
                    start=i+1;
                    break;
                }
            }
            end++;
        }
      if(max_len>(end-start))
      {
         return max_len;
      }
      else
      {
        return (end-start);
      }
    }
    
}

 本题目使用解法偏向暴力法,时间复杂度偏向于O(n^2)。接下来总结一下思路。

首先,我们要求最长的无重复的最长子字符串。我们的目的是列举出所有的字符串,并从这些字符串中找到一个长度最长且没有重复字符的字符串。分开来说就是三点。

1.列举所有字符串

2.判断该字符串有没有重复字符

3.从这些没有重复字符的字符串中找到一个长度最长的字符串。

接下来,我们详细的来思考这个问题。

1.如果这个字符串长度为0,结果直接返回0,长度为1的话,直接返回1.

2.当该字符串长度>=2的时候,我们设置两个边界。start和end,其就像刀一样截取子字符串长度为[start,end)。

3.为了解决是否存在重复字符的问题,我们每次向当前子字符串尾根据条件插入一个新的字符s[end],从s[start]到s[end-1]依次检查是否存在和s[end]相等的元素,如果没有就把end添加到子字符串的末尾end++,否则说明如果加上末尾这个字符整个字符串就有重复字符了,应当及时止损。记录此时从start到(end-1)的长度,记为当前无重复子字符串的长度,如果其比当前最长无重复字符串长,就更新最长无重复子字符串。之后start应当跳转到重复字符位置的前一个位置即i+1,为什么这么做呢?而不是start++呢?

4.因为如果start++可能使得start在重复字符的前面,接下来end++会使得新的子字符串依然包含重复字符。

5.为什么最后要有比较(max_len)和(end-start)的判断呢?假如字符串都是没有重复的,那么就不会执行更新max_len的操作,这时候就要在最后判断一下是否max_len>(end-start)

原文地址:https://www.cnblogs.com/mengxiaoleng/p/11397141.html