计算最长子字符串

  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;
        }
    }
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐