首先上题目:
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;
}