描述:
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例:
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
想法:
- 遍历字符串,记录符合的字符串的起点与终点,字典进行添加删除
- 遍历字符串方式不一样,根据起始点遍历,列表进行添加删除
- 推荐:删除元素时直接删除一串,而不是一个一个删除
static public int LengthOfLongestSubstring(string s)
{
if (s.Length < 2) return s.Length;
Dictionary<char, int> dic = new Dictionary<char, int>();
int left = 0, right = 0, result = 0;
for (int i = 0; i < s.Length; i++)
{
while (dic.ContainsKey(s[i]))
{
dic.Remove(s[left]);
left++;
}
dic.Add(s[i], i);
right++;
if (right - left >= result)
result = right - left;
}
return result;
}
static public int LengthOfLongestSubstring(string s)
{
if (s.Length < 2) return s.Length;
List<char> list = new List<char>();
int left = 0, right = 0, result = 0;
for (; right < s.Length;)
{
if (list.Contains(s[right]))
{
list.Remove(s[left]);
left++;
}
else
{
list.Add(s[right]);
right++;
result = (right - left) > result ? (right - left) : result;
}
}
return result;
}
public int LengthOfLongestSubstring(string s)
{
List<char> ls = new List<char>();
int intMaxLength = 0;
for (int i = 0; i < s.Length; i++)
{
if (ls.Contains(s[i]))
{
ls.RemoveRange(0, ls.IndexOf(s[i]) + 1);
}
ls.Add(s[i]);
intMaxLength = ls.Count > intMaxLength ? ls.Count : intMaxLength;
}
return intMaxLength;
}