查找最长数字子串

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

/*
 * Problem 1: 
 *  You are given a string, and the task is to implement a function
 * that finds the longest unrepeated string. For example, the longest
 * substring without repeating letters for “abcabcbb” is “abc”, 
 * which the length is 3. For “bbbbb” the longest substring is “b”,
 * with the length of 1. For "ababzab", it is "abz" and the length is 3.
 * The string contains only lower-cased letters, i.e., 'a'-'z'.
 * 
 */

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string test1 = "abcadbcbb";
            string test2 = "ababzab";
            string test3 = "bbbbb";

            string result1 = LongestUnrepeatedString(test1);
            string result2 = LongestUnrepeatedString(test2);
            string result3 = LongestUnrepeatedString(test3);

            System.Console.WriteLine("longest unrepeated string of \"{0}\" is \"{1}\".", test1, result1);
            System.Console.WriteLine("longest unrepeated string of \"{0}\" is \"{1}\".", test2, result2);
            System.Console.WriteLine("longest unrepeated string of \"{0}\" is \"{1}\".", test3, result3);

            System.Console.ReadLine();
        }

        static string LongestUnrepeatedString(string input)
        {
            if (input == null) return null;
            // <character, index+1>
            Dictionary<Char, Int32> dict = new Dictionary<Char, Int32>();

            int n = input.Count();

            string longestString = "";
            int longestCount = 0;

            int i = 0, j = 0;

            while (i < n && j < n)
            {
                // try to extend the range [i, j]
                if (!dict.ContainsKey(input.ElementAt(j)))
                {
                    dict.Add(input.ElementAt(j), j++);
                }
                else
                {
                    // Update the longest unrepeated string
                    if (longestCount < j - i)
                    {
                        longestCount = j - i;
                        longestString = input.Substring(i, longestCount);//substring, update
                    }

                    //Update "i" and "j", the new range
                    i = j = dict[input.ElementAt(j)] + 1;

                    dict.Clear();
                }
            }

            return longestString;

        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值