首页 新闻 会员 周边

C# 统计连续字符串 出现次数

0
悬赏园豆:15 [已解决问题] 解决于 2014-04-17 10:17

如题,统计连续字符串出现的次数。

比如“AAAABBBBBBBCCCCCMMMMMMM...”,

统计出

A出现了4次,

B出现了6次,

C出现了5次,

M出现了7次

...

类似于这样的需求怎么实现呢?有没有合适的方法呢,或者提供个想法也行。

小也的主页 小也 | 初学一级 | 园豆:75
提问于:2014-04-16 17:50
< >
分享
最佳答案
0

    class Program
    {
        static void Main(string[] args)
        {
            string str = "AAAABBBBBBBCCCCCMMMMMMMNadcdfss";
            Dictionary<char, int> dic = new Dictionary<char, int>();
            for (int i = 0; i < str.Length; i++)
            {
                //如果key已经包含了某个字符 则不再添加 让它的value加一
                if (dic.Keys.Contains(str[i]))
                {
                    dic[str[i]]++;
                }
                else
                {
                    //不包含 则添加到字典中 并设置value为1
                    dic.Add(str[i], 1);
                }
            }
            foreach (KeyValuePair<char,int> item in dic)
            {
                Console.WriteLine("{0}出现了{1}次",item.Key,item.Value);
            }
            Console.Read();
        }
    }

结果:

收获园豆:8
wolfy | 老鸟四级 |园豆:2636 | 2014-04-16 21:29

希望能帮到你

wolfy | 园豆:2636 (老鸟四级) | 2014-04-16 21:29

谢谢您的回答,那如果把字符串改成“AAAABBBBBBBCCCCCAAAAAAA”呢?

想要的结果是

AAAA出现1次,

BBBBBBB出现1次,

CCCCC出现1次,

AAAAAAA出现1次

需求我没理清楚,望大神指教

小也 | 园豆:75 (初学一级) | 2014-04-17 09:13

@小也:

        //如果key已经包含了某个字符 则不再添加 让它的value加一
                if (!dic.Keys.Contains(str[i]))
                {
                    //不包含 则添加到字典中 并设置value为1
                    dic.Add(str[i], 1);
                }
              把这个地方改一下 就可以了

wolfy | 园豆:2636 (老鸟四级) | 2014-04-17 09:27

@wolfy: 

string str = "AAAABBBBBBBCCCCCMMMMMMMNadcdfssAAAA";
Dictionary<string, int> dic = new Dictionary<string, int>();

string tempString = string.Empty;
string tempChar = string.Empty;
for (int i = 0; i < str.Length; i++)
{
if (tempChar == str[i].ToString())
{
//tempString += str[i].ToString();
}
else
{
tempChar = str[i].ToString();
if (!string.IsNullOrEmpty(tempString))
{
//如果key已经包含了某个字符 则不再添加 让它的value加一
if (dic.Keys.Contains(tempString))
{
dic[tempString]++;
}
else
{
//不包含 则添加到字典中 并设置value为1
dic.Add(tempString, 1);
}
tempString = string.Empty;
}
}
tempString += tempChar;
//最后一次循环的结果添加入字典
if (i == str.Length - 1)
{
//如果key已经包含了某个字符 则不再添加 让它的value加一
if (dic.Keys.Contains(tempString))
{
dic[tempString]++;
}
else
{
//不包含 则添加到字典中 并设置value为1
dic.Add(tempString, 1);
}
}
}

foreach (KeyValuePair<string, int> item in dic)
{
Console.WriteLine("{0}出现了{1}次", item.Key, item.Value);
}
Console.Read();

小也 | 园豆:75 (初学一级) | 2014-04-17 10:15
其他回答(2)
0

你应该这样想,字符串其实就是一个一个的字符拼接的,你把他还原成字符数组,使用linq的groupby 不就出来了

string str="aaabbbbbbbbccccccccccc";

char[] c=str.tochars();

后面linq的groupby

收获园豆:4
幕三少 | 园豆:1384 (小虾三级) | 2014-04-16 18:29

刚没看清,你要的是连续出现的次数,思路大致一样,转成字符数组,循环数组,取第一个比较,相同加一,不同时……呵呵,后面我想就不用我说了吧

支持(0) 反对(0) 幕三少 | 园豆:1384 (小虾三级) | 2014-04-16 18:32
0

我就说一下思路吧~最好呢就是先把这整个字符串排好序,那么所有相同的字符都会靠在一起,然后用一个for循环从第一个遍历,遇到一个新的字符开始为当前字符计数直到遇到新的另外一个字符,那么如此类推就可以得出答案了。 

收获园豆:3
Mushroom0417 | 园豆:327 (菜鸟二级) | 2014-04-17 07:53
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册