假设有一个字符串“abcdebfgh”
那么最长不重复字串是"cdebfgh",长度是7
若是:abcdbefbghijij
应输出:befbghij
|
|
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication10
{
class Program
{
static void Main(string[] args)
{
string ss = "abcdbefbghijij";
var list = ss.ToCharArray();
int left = 0;
int right = 0;
GetLen(list, out left, out right);
Console.WriteLine(ss.Substring(left, right - left + 1));
}
/// <summary>
///
/// </summary>
/// <param name="list"></param>
/// <param name="left">right index from 0</param>
/// <param name="right">right index from 0</param>
/// <returns></returns>
public static int GetLen(char[] list, out int left, out int right)
{
if (list == null || list.Length <= 0)
{
throw new Exception("the input list length is 0");
}
int len = list.Length;
left = 0;
right = 0;
int maxLen = 0;
int start = 0;
int tempMaxLen = 0;
Dictionary<char, int> cache = new Dictionary<char, int>();
for (int i = 0; i < len; i++)
{
if (!cache.Keys.Contains(list[i]) || cache[list[i]]==-1) //这个建不存在或者有建,但是值为-1,表明这个字符还没出现过.
{
tempMaxLen++;
cache.Add(list[i], i);
}
else
{
//there is duplicated char abcdbefgh
if (tempMaxLen > maxLen)
{
maxLen = tempMaxLen;
left = start;
right = i - 1;
}
tempMaxLen = i - cache[list[i]];
for (int j = start; j < cache[list[i]]; j++) // 注意:网上好多例子是清楚这个cache里所有的,应该是错误的;仅仅应该清楚上次重复字符前面的字符。
{
cache[list[j]] = -1;
}
start = cache[list[i]] + 1;
cache[list[i]] = i;
}
}
if (tempMaxLen > maxLen)
{
maxLen = tempMaxLen;
left = start;
right = len-1;
}
return maxLen;
}
}
}