avatar

算法研究-无重复字串

这个系列是笔者练习LeetCode上的算法题的记录&分享

题目

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

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

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

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

请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

题解

根据示例可以得出一些需要注意的地方
1. 得到的是字串,并不是子序列
2. 得到的是一个无重复字符的字串

第一次尝试的思路是,遍历所有字符,每次,检查首字符和首字符最后一次出现的地方,然后重复这个过程。代码如下

public int LengthOfLongestSubstring(string s)
{
string getMaxLength = "";
for (int i = 0; i < s.Length; i++)
{
Debug.Log("TAG " + i);
string getStr = GetChars(s,i);

if (getStr.Length > getMaxLength.Length)
{
getMaxLength = getStr;
}

if (getMaxLength.Length >= (s.Length - i))
{
break;
}
}
Debug.Log("TAG MaxStr is " + getMaxLength);
return getMaxLength.Length;
}

string GetChars(string str,int i)
{
string get = str;
Debug.Log("TAG str is " + str + " and i " + i);
if (str.Length > 1) {
if (str.LastIndexOf(str[i]) != -1 && str.LastIndexOf(str[i]) != i)
{
get = GetChars(str.Substring(i, str.LastIndexOf(str[i])), 0);
}
else
{
get = str.Substring(i);
}
}
return get;
}

但是无法判断其他字符是否有重复出现,以及代码中没有对 “bbbbb” 此类做处理


看了题解之后,得到以下思路(滑动窗口):

将字符串依次放入一个集合,每次,放入之后最大长度 +1 ,如果放入的字符已经有了,则判断,剔除已有字符之前所有字符后,新字符串是否比最大长度更长(此处应该是 大于等于),如果更长,则剔除并更新长度,如果没有则停止判断。

代码如下:

public int LengthOfLongestSubstring(string s)
{
int maxLength = 0;
List<char> getChar = new List<char>();
for (int i = 0; i < s.Length; i++)
{
if (getChar.Contains(s[i]))
{
getChar.RemoveRange(0, getChar.IndexOf(s[i])+1);
getChar.Add(s[i]);
}
else {
getChar.Add(s[i]);
}
if (getChar.Count > maxLength) {
maxLength = getChar.Count;
}
}
return maxLength;
}
文章作者: 不君子
文章链接: http://yoursite.com/2019/09/03/Algorithm3-LongestSubstring/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 不君子