求教,下面算法如何简化,写了1小时,感觉很拉杂,求指点
无意间看到CSDN有个在线编程题目,大致是: 计算 类似于bibinbingbbiinngg这样的字符串 可以在不交换字符顺序的情况下组成多少个bing 。 由于是技术渣,又没学过算法,所以求小伙伴们指点一下,或者有什么比较好的方法
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");
[解决办法]
看起来就是树吧,把树构建起来,再数它的叶节点
[解决办法]
趁下班前写一个,未验证
[解决办法]
构建树,遍历叶节点是直观的做法。
[解决办法]
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;
}