今天看了CSDN英雄会上的一道编程题,自己想了下,没有想到什么好的算法,就用最容易想到的估计也是最复杂的方式试了下,呵呵,最后提交不成功,编译时间过长,等待别人好的算法。
题目详情
题目详情
本届大赛由微软必应词典冠名,必应词典(http://cn.bing.com/dict/?form=BDVSP4&mkt=zh-CN&setlang=ZH)是微软推出的新一代英语学习引擎,里面收录了很多我们常见的单词。但现实生活中,我们也经常能看到一些毫无规则的字符串,导致词典无法正常收录,不过,我们是否可以从无规则的字符串中提取出正规的单词呢?
例如有一个字符串"iinbinbing",截取不同位置的字符‘b’、‘i’、‘n’、‘g’组合成单词"bing"。若从1开始计数的话,则‘b’ ‘i’ ‘n’ ‘g’这4个字母出现的位置分别为(4,5,6,10) (4,5,9,10),(4,8,9,10)和(7,8,9,10),故总共可以组合成4个单词”bing“。
咱们的问题是:现给定任意字符串,只包含小写‘b’ ‘i’ ‘n’ ‘g’这4种字母,请问一共能组合成多少个单词bing?
字符串长度不超过10000,由于结果可能比较大,请输出对10^9 + 7取余数之后的结果。
代码如下:
public class Bing {
public static void main(String[] args) {
StringBuilder str = new StringBuilder();
for(int i=0;i<10;i++){
str.append("iinbinbingiinnbbggbingiinnbbggbingiinnbbggbibingbbg");
}
System.out.println(howmany(str.toString()));
}
public static int howmany(String s){
long sum = 0;
int len = s.length();
for(int i=0;i<len-3;i++){
if(s.charAt(i)=='b'){
for(int j=i+1;j<len-2;j++){
if(s.charAt(j)=='i'){
for(int h=j+1;h<len-1;h++){
if(s.charAt(h)=='n'){
for(int k=h+1;k<len;k++){
if(s.charAt(k)=='g'){
sum++;
}
}
}
}
}
}
}
}
return (int) (sum%getMod());
}
public static long getMod(){
long result = 1;
for(int i=0;i<9;i++){
result*=10;
}
return result+7;
}
}