首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

求教,下面算法怎么简化,写了1小时,感觉很拉杂,求指点

2014-01-25 
求教,下面算法如何简化,写了1小时,感觉很拉杂,求指点无意间看到CSDN有个在线编程题目,大致是: 计算 类似于

求教,下面算法如何简化,写了1小时,感觉很拉杂,求指点
无意间看到CSDN有个在线编程题目,大致是: 计算 类似于bibinbingbbiinngg这样的字符串 可以在不交换字符顺序的情况下组成多少个bing 。 由于是技术渣,又没学过算法,所以求小伙伴们指点一下,或者有什么比较好的方法求教,下面算法怎么简化,写了1小时,感觉很拉杂,求指点



        static void Main(string[] args)
        {
            Console.WriteLine(howmany("bibinbing"));
        }
        static List<char> list_b = new List<char>();
        static List<char> list_i = new List<char>();
        static List<char> list_n = new List<char>();
        static List<char> list_g = new List<char>();
        public static int howmany(string s)
        {
            foreach (char c in s.ToCharArray())
            {
                list_b.Add(c);
            }
            int res = 0;
            while (list_b.Contains('b'))
            {
                Remove(list_b, out list_i, 'b');
                while (list_i.Contains('i'))
                {
                    Remove(list_i, out list_n, 'i');
                    while (list_n.Contains('n'))
                    {
                        Remove(list_n, out list_g, 'n');
                        res += list_g.Count(l => l == 'g');
                    }
                }
            }
            return res;
        }

        private static void Remove(List<char> list,out List<char> _list,char c)
        {
            _list = new List<char>();
            int index = list.IndexOf(c);
            foreach (char _c in list)
            {
                _list.Add(_c);
            }
            for (int i = 0; i <= index; i++)
                _list.RemoveAt(0);
            list.Clear();
            foreach (char _c in _list)
            {
                list.Add(_c);
            }
            
        }


[解决办法]
有没有原题目?
[解决办法]
正则呀

            string txt = "bibinbingbbiinnggbingg";
            Regex reg = new Regex(@"bing");
            Response.Write(reg.Matches(txt).Count);
            Response.End();
[解决办法]
如果去开不重合的字符
            string txt = "bibinbingbbiinngg";
            Regex reg = new Regex(@"b[\s\S]*?i[\s\S]*?n[\s\S]*?g");
[解决办法]
看起来就是树吧,把树构建起来,再数它的叶节点
[解决办法]
趁下班前写一个,未验证

求教,下面算法怎么简化,写了1小时,感觉很拉杂,求指点
[解决办法]
构建树,遍历叶节点是直观的做法。

[解决办法]


public static int howmany(string s)
        {
            int b = 0, bi = 0, bin = 0, bing = 0;
            for (int i = 0; i < s.Length; i++)
            {
                switch (s[i])
                {
                    case 'b':
                        b++;
                        break;
                    case 'i':
                        bi += b;
                        break;
                    case 'n':
                        bin += bi;
                        break;
                    case 'g':
                        bing += bin;
                        break;
                }
            }
            return bing % 1000000007;
        }

分别记录b,bi,bin,bing出现的次数.
从头开始扫描字符串
遇到'b'的时候,b的数量加1
遇到'i'的时候,bi的数量加上b的数量
遇到'n'的时候,bin的数量加上bi的数量
遇到'g'的时候,bing的数量加上bin的数量
最后返回bing的数量就好了.

时间复杂度O(n)
[解决办法]
其实这是一个回溯的问题
[解决办法]
先找到最后一个g截取他后面这段算下g的个数,在最后一个g前面这段,以此类推找到n i b的个数相乘不知道可行不

热点排行