IndexOfを使って書き直してみました。
先日の記事:2009-10-12 - (ジラールのF)#関連。
筆者さんからのコメントに触発されてIndexOfを用いて書き直してみました。StringBuilderを使うのがポイントですね。そこそこ速いです。
private static string get1DimCantorDust(int time) { if (time == 0) return "X"; string c = get1DimCantorDust(time-1); return c + new String('.', c.Length) + c; } private static int numOverlap(string p, string patC) { int num = 0; for (int start = patC.IndexOf(p, 0); start != -1; start = patC.IndexOf(p,++start)) ++num; return num; } private static bool isBlank(string[] pat) { foreach (string p in pat) if (p.IndexOf('X') != -1) return false; return true; } public int occurrencesNumber(string[] pattern, int time) { StringBuilder projX = new StringBuilder(new String('.', pattern.Length)); StringBuilder projY = new StringBuilder(new String('.', pattern[0].Length)); for (int x = 0; x < pattern.Length; ++x) for (int y = 0; y < pattern[0].Length; ++y) if (pattern[x][y] == 'X') projX[x] = projY[y] = 'X'; for (int x = 0; x < pattern.Length; ++x) for (int y = 0; y < pattern[0].Length; ++y) if ((pattern[x][y] == '.') && (projX[x] == 'X') && (projY[y] == 'X')) return 0; string patCantor = get1DimCantorDust(time); int mX = numOverlap(projX.ToString(), patCantor); int mY = numOverlap(projY.ToString(), patCantor); return !isBlank(pattern) ? mX * mY : mY * (patCantor.Length - pattern.Length + 1) + mX * (patCantor.Length - pattern[0].Length + 1) - mX * mY; }