私はRegexでString substrings generatorのアプローチをしようとしていました。 アイデアはありましたが、それほど明確ではありませんでしたが、最終的にアプローチがありました。それほど多くはテストされていませんが、今では可変サイズの不明な単語に対して可能なすべての部分文字列(左から右へ)を作成します。
これはC#Regexエンジンで動作します。ベンチマークも複雑さも計算していない(O(N^2)のように見える?)。
私は数時間前にマイクロソフトインタビューで与えられた問題に対して、別のアプローチをしたいと思っていました。ポイントは、対角線、水平および垂直(左から右、上から下)のNサイズのNワード(この例ではサイズ4のワード4つ)のマトリックス内のすべての可能な単語を見つけることでした。
static void CheckWords(String[] words, HashSet<String> valid)
{
//Horizontal
foreach(var w in words)
FindWords(w, valid);
//Vertical
String word = "";
for(int i = 0; i < words.Length; i++)
{
for(int j = 0; j < words[i].Length; j++)
word += words[j][i];
FindWords(word, valid);
word = "";
}
//Diagonal
String word2 = "";
for(int i = 0, j = 0; i < words.Length; i++, j++)
{
word += words[i][j];
word2 += words[i][words[i].Length - i - 1];
}
FindWords(word, valid);
FindWords(word2, valid);
}
static void FindWords(String word, HashSet<string> valid)
{
int len = word.Length;
//Generate all possible (left to right) substring for String with Length - a [ FOr example, for "MAKE" we can have possible values for "MAKE", "MAK", "MA", "M", "AKE", "KE", "K, "E", "A
for(int a = 0; a < len; a++)
{
//Find all possible substring with this length { k = 1, k = 2, k = 3, ..., k = word.Length }
for(int k = 1; k <= word.Length; k++)
{
Match match = new Regex(@"([A-Za-z]{" + k + "}){1}").Match(word);
//For all found groups, we just care for the first group wich contains the main unrepeated substrings
for(int i = 0; i < match.Groups.Count - 1; i++)
for(int j = 0; j < match.Groups[i].Captures.Count; j++) //Check each permutation for each word with K length. You can Console.Write each value to check it's generated string
if(valid.Contains(match.Groups[i].Captures[j].Value))
Console.WriteLine(match.Groups[i].Captures[j].Value);
}
word = word.Substring(1, word.Length - 1);
}
}
だから、この入力を与えられた:
HashSet<String> words = new HashSet<string>();
words.Add("MAKE");
words.Add("MAD");
words.Add("END");
words.Add("MINE");
String[] array = { "MAKE", "IEMY", "NIAH", "ENDN" };
CheckWords(array, words);
は、辞書内の配列内のすべての4つの単語を見つける必要があります。
正規表現エンジンを同じ場所で複数回マッチさせることはできません。つまり、正規表現だけでこの問題を解決することはできません。正規表現なしで文字列のすべての可能な順列を作成します。 –
@WiktorStribiżewだから私の推測では、手作業で単語内のすべての可能な部分文字列を見つける方法です。私はちょうどエンジンが爆発するようにしようと冷ややかでした(: –
申し訳ありませんが、正規表現はそのような順列を作成するつもりはありません。ネストされたキャプチャグループを使用して同じポイント( '((M)A)K)E)'のような値を取得することができますが、それはあなたが必要とするものではないでしょう。 –