问题
给定一个字符串,找出不含有重复字符的最长子串的长度。
示例:
给定 “abcabcbb” ,没有重复字符的最长子串是 “abc” ,那么长度就是3。
给定 “bbbbb” ,最长的子串就是 “b” ,长度是1。
给定 “pwwkew” ,最长子串是 “wke” ,长度是3。请注意答案必须是一个子串,“pwke” 是 子序列 而不是子串。
C#代码
// 方法1 直接来
static public int LengthOfLongestSubstring(string s)
{
string m = "";
int max = 0;
for (int i = 0; i < s.Length; i++)
{
if (m.IndexOf(s[i]) >= 0)
{
m = m.Remove(0, m.IndexOf(s[i]) + 1);
m += s[i];
}
else
{
m += s[i];
}
if (m.Length > max) max = m.Length;
}
return max;
}
// 方法2 使用hashtable存储,直接更改键对应的值
static public int LengthOfLongestSubstring2(string s)
{
Hashtable m = new Hashtable();
int max = 0;
for (int i = 0, j = 0; i < s.Length; i++)
{
if (m.ContainsKey(s[i]))
{
j = Math.Max((int)m[s[i]], j);
max = Math.Max(max, i - j + 1);
m[s[i]] = i + 1;
}
else
{
max = Math.Max(max, i - j + 1);
m.Add(s[i], i + 1);
}
}
return max;
}
滑动窗口
遍历字符串,添加到m
中,检测第i
个字符,没有直接添加,若m
中已经存在该字符,则找到该字符的位置j
,将开始字符位置0
到j
的所有字符删除,然后再添加第i
个字符,每次都要比较保存最大字符串长度max
,最后返回max。
一个是直接删除一段,一个是改变键的值