CSDN微软必应编程题

今天看了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;
	}

}



你可能感兴趣的:(CSDN微软必应编程题)