質問の最初の部分は、この質問の複製です:文字列が一連の文字のサブセットであるかどうかを確認しますか? (正規表現)?
この回答は、直面している実際の問題 (質問の 2 番目の部分) に取り組むことに専念しています。
非常に単純な解決策は、2 つのマップを使用することです。1 つは元のセットの文字の頻度をマップし、 の数を記録し.
、もう 1 つは各入力文字列の文字の頻度をマップします。
擬似コード:
// I assume the maps return 0 for non existent entries
// Depending on the input, the map can simply be an array, or a tree/hash map
function checkAnagramExtended(originalString, inputString):
if (inputString.length > originalString.length):
return false
// The frequency mapping for original string (ref stands for reference)
// Ideally, refMap should be filled up once instead of every call
// to this function
var refMap = countFrequency(originalString)
// The frequency mapping for input string
var inpMap = empty map
foreach (character c in inputString):
if (inpMap[c] >= refMap[c]):
// You may want to check that c is a character allowed
// to be substituted by dot .
// if (!canBeSubstitutedByDot(c)):
// return false
if (inpMap['.'] >= refMap['.']):
return false
else:
inpMap['.'] += 1
else:
inpMap[c] += 1
return true
付録: 正規表現ソリューションの拡張?
任意の文字を一致させることができるドット.
拡張a-z
により、正規表現ソリューションはさらに非現実的になります。
もう 1 つの問題に対する私の解決策では、否定先読みに大きく依存して、特定の文字の数が文字のマルチセット内の最大文字数よりも少ないことを確認しました。
ドット.
拡張子は、任意の文字に許可される最大文字数を変えることができるため、上記の私の解決策を破ります。正規表現に仕事を強制すると、 1 しかない場合でも正規表現を生成でき.
ますが、2 に増やすと事態は爆発します。