问题的第一部分是这个问题的重复:检查字符串是否是一堆字符的子集?(正则表达式)?
该答案专门用于解决您面临的实际问题(问题的第二部分)。
一个非常简单的解决方案是使用 2 个映射:一个映射原始集中字符的频率,并记下 的数量.
,另一个映射每个输入字符串的字符频率。
伪代码:
// 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 就可以生成正则表达式.
,但是当你将它增加到 2 时事情会爆炸。