LeetCode OJ 刷题日记 —— 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.

Subscribe to see which companies asked this question

这个题目的大概意思就是我给你一个字符串,然后你给我一个子字符串的长度,注意,这里的子字符串必须满足下面几个条件:

  • 没有重复的字符;
  • 是满足上一个条件的子字符串中长度最长的子字符串。

方案一解题思路

显然解决这一题的关键在于查找子字符串,并且判断子字符串中是否有重复

那我们先用最笨的方法来解决这个问题:
这里写图片描述
废话不多说,先上代码:

     public int LengthOfLongestSubstring(string s)
        {
            if (s.Length == 0 || s.Length == 1)
            {
                return s.Length;
            }

            int maxLength = 1;

            for (int i = 0; i < s.Length; i++)
            {
                for (int j = i; j < s.Length; j++)
                {
                    string ss = s.Substring(i, j - i + 1);
                    if (!HasEqualChar(ss) && maxLength < ss.Length)
                    {
                        maxLength = ss.Length;
                    }
                }
            }

            return maxLength;
        }

        /// <summary>
        /// 判断字符串中是否有相同字符
        /// </summary>
        /// <param name="a"></param>
        /// <returns></returns>
        private bool HasEqualChar(string s)
        {
            for (int i = 0; i < s.Length - 1; i++)
            {
                for (int j = i + 1; j < s.Length; j++)
                {
                    if (s[i] == s[j])
                    {
                        // 有相同字符
                        return true;
                    }
                }
            }

            // 没有相同字符
            return false;
        }
}

这应该是思路最简单的想法了,这样虽然可以实现功能,但是提交仍然不能通过,原因就是时间复杂度太高了。

方案二解题思路

方案二主要是为了解决时间复杂度这个问题,这里我还是参考了一下网上的一些答案。
这种解法的关键在于数组,我们新添加了一个数组,用于保存出现过的字符的位置,闲话不多说,直接上代码吧!!

    public int LengthOfLongestSubstring(string s)
    {
        // 定义一个数组,用于记录出现过的字符的位置
        // 并为数组初始化为 -1
        int[] locs = new int[255];

        for (int i = 0; i < locs.Length; i++)
        {
            locs[i] = -1;
        }

        // 字符串的长度,初始长度为 0
        int maxSubstringLength = 0;

        // 当前子字符串的位置,初始为 -1
        int subStringPos = -1;

        for (int i = 0; i < s.Length; i++)
        {
            // 若已经字符出现过,则将子字符串的位置设为:前一个字符的位置
            if (locs[s[i]] > subStringPos)
            {
                subStringPos = locs[s[i]];
            }

            if (i - subStringPos > maxSubstringLength)
            {
                maxSubstringLength = i - subStringPos;
            }

            locs[s[i]] = i;
        }

        return maxSubstringLength;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值