计算最长子字符串
计算最长子字符串class Program{static void Main(string[] args){DateTime date1 = DateTime.Now;string outStr = "";int c=LengthOfSubString("aabccddabcd",out outStr);Console.WriteLine("子字符串的长度为:"+
·
计算最长子字符串
class Program
{
static void Main(string[] args)
{
DateTime date1 = DateTime.Now;
string outStr = "";
int c= LengthOfSubString("aabccddabcd",out outStr);
Console.WriteLine("子字符串的长度为:"+c);
Console.WriteLine("最长子字符串为"+outStr);
Console.WriteLine("耗费时间(单位:毫秒)"+(DateTime.Now-date1).ToString(@"fff"));
}
/*使用双指针,可以把最长字串看在一个str[i,j]集合中,i记录开头,j记录结尾,比较s[j]是否与子串s[i,j]重复即可*/
/*如果不重复,那么把尾的指针望右边移动一位,并且与最大长度进行比较,把最大长度赋值给ans*/
/*如果重复,头指针往后面进行移动,并删除原来头指针的元素*/
private static int LengthOfSubString(string str, out string outStr)
{
StringBuilder sb = new StringBuilder();
string subString = "";
int n = str.Length;
ISet<char> set = new HashSet<char>();
int ans = 0, i = 0, j = 0;
while (i < n && j < n)
{
// try to extend the range [i, j]
if (!set.Contains(str[j]))
{
sb.Append(str[j]); //把不重复的元素加入到StringBuilder里面,直至到出现重复元素
set.Add(str[j++]);
ans = Math.Max(ans, j - i);
}
else
{
/*当有一个重复的元素之后,先比较是不是为空,为空不添加subString只保存最长的子字符串,然后清空StringBuilder
* 方便下次进行装元素,这里知识为了输出最长的字符串*/
if (sb.Length != 0)
{
if (sb.Length>subString.Length)
{
subString = sb.ToString(); //永远只保存最长的字串
}
}
set.Remove(str[i++]);
sb.Clear();
}
}
outStr = subString;
return ans;
}
}
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)