C# 如何计算重复的字数?谢谢

ldg9tpl 2014-04-29 09:25:10
想做一个输入数据的检测,用以考查用户输入的认真程度,以便初步决定一个帖子是否需要审核后,才准许发布。

举例如下:
string content1="贵阳,一个夏天度假的好地方。那地方我确实去过,山好水好空气好,确实值得大家去玩一玩";
此内容,几乎没有重复字符,可以先发后审。

string content2="你大爷你大爷你大爷你大爷你大爷你大爷你大爷你大爷你大爷你大爷你大爷你大爷";
string content3="啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊"
string content4="sssssssssssssssssssssssssssssssssssss";
string content5="................放屁放屁....……………操操操操….....................";

从以上举例看,只有第一个是OK的。
第2、3、4、5种情形都需要先审后发,请问高人们,用C#如何捕获内容中重复的字符数?
比方说,得知用户输入的内容中,重复的字符数比例高达40%以上,如下:
重复字符数÷总字符数=0.45,对策:该用户可能是恶意行为,先审后发。

难就难在没有预设字符,根本不知道用户将会输入些什么。

请叫高手们,如何实现?谢谢!
...全文
425 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
PaulyJiang 2014-05-05
  • 打赏
  • 举报
回复
string abc = "123123123123123123123123123123"; var array = abc.ToCharArray(); foreach (char item in array.Distinct()) { var count = array.Count(s => s.CompareTo(item) == 1); Console.WriteLine(string.Format("{0}:{1}", item, count)); } Console.Read();
sunjoin2009 2014-05-04
  • 打赏
  • 举报
回复
思路: 1.抽取单个字符进行比较; 2.抽取字符串进行比较。
佛火 2014-05-04
  • 打赏
  • 举报
回复
再次更正:

            //假定重复次数超过 字符串长度/3 就算恶意重复,如果长度小于24,取值3。
            var minDuplicateRefer = length >= 24 ? length >> 3 : 3;
佛火 2014-05-04
  • 打赏
  • 举报
回复
更正:

            //假定重复次数超过 字符串长度/8  就算恶意重复
            var minDuplicateRefer = length >> 3;
佛火 2014-05-04
  • 打赏
  • 举报
回复

        static void Main(string[] args)
        {
            var samples = new string[]{
                "贵阳,一个夏天度假的好地方。那地方我确实去过,山好水好空气好,确实值得大家去玩一玩",
                "你大爷你大爷你大爷你大爷你大爷你大爷你大爷你大爷你大爷你大爷你大爷你大爷",
                "sssssssssssssssssssssssssssssssssssss",
                "................放屁放屁....……………操操操操…....................."
            };
            
            foreach(var item in samples)
            {
                var rate = GetDuplicatedRate(item);
                Console.Write("样本:");
                Console.WriteLine(item);
                Console.WriteLine("duplicatedRate = {0:00.00%}", rate);
                Console.WriteLine();
            }
        }

        static float GetDuplicatedRate(string input)
        {
            var length = input.Length;

            //假定重复次数超过 字符串长度/3 就算恶意重复
            var minDuplicateRefer = length >> 3;

            var duplicated = input.GroupBy(ch => ch)
                .Select(g => new
                {
                    Char = g.Key,
                    Count = g.Count()
                })
                .Where(ch => ch.Count > minDuplicateRefer)
                .Sum(ch => ch.Count);

            var duplicatedRate = (float)duplicated / length;

            return duplicatedRate;
        }
计算结果:

样本:贵阳,一个夏天度假的好地方。那地方我确实去过,山好水好空气好,确实值得大家去玩一玩
duplicatedRate = 00.00%

样本:你大爷你大爷你大爷你大爷你大爷你大爷你大爷你大爷你大爷你大爷你大爷你大爷
duplicatedRate = 100.00%

样本:sssssssssssssssssssssssssssssssssssss
duplicatedRate = 100.00%

样本:................放屁放屁....……………操操操操….....................
duplicatedRate = 74.55%
MASD 2014-05-04
  • 打赏
  • 举报
回复
这么一个算法都搞不定啊,在我看来是相当Easy的。
直面人生 2014-04-30
  • 打赏
  • 举报
回复
这个怎么判断是个问题..
於黾 2014-04-30
  • 打赏
  • 举报
回复
嗯,完全不靠谱 比如我想举个例子,所以需要用到大量的重复字符,比如abcd1abcd2abcd3abcd4abcd5 难道这样就是灌水了? 而如果我是随手乱敲进去,比如林地简欧风精灵交流立即分裂昂罗经理阿德里妇女file昂立 一个重复字符都没有,但是内容毫无意义
threenewbee 2014-04-29
  • 打赏
  • 举报
回复
你的思路本身就有问题。用重复字符衡量文本是否有意义是不靠谱的。
bwangel 2014-04-29
  • 打赏
  • 举报
回复
建立一个计数器,扫描整个串,计数器可用Hash表实现, 比如:

var str = "xxxxx";
Hashtable ht =new Hashtable();
foreach(char c in str){
 if (ht[c]==null)ht[c]=0;
((int)ht[c])++;
}
if (str.length / ht.Count > 10) //10是一个阀值,可以设定 
  error("您在灌水");

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧