你有一个单词列表 words 和一个模式 pattern,你想知道 words 中的哪些单词与模式匹配。
如果存在字母的排列 p ,使得将模式中的每个字母 x 替换为 p(x) 之后,我们就得到了所需的单词,那么单词与模式是匹配的。
(回想一下,字母的排列是从字母到字母的双射:每个字母映射到另一个字母,没有两个字母映射到同一个字母。)
返回 words 中与给定模式匹配的单词列表。
你可以按任何顺序返回答案。
示例:
输入:words = ["abc","deq","mee","aqq","dkd","ccc"], pattern = "abb"
输出:["mee","aqq"]
解释:
"mee" 与模式匹配,因为存在排列 {a -> m, b -> e, ...}。
"ccc" 与模式不匹配,因为 {a -> c, b -> c, ...} 不是排列。
因为 a 和 b 映射到同一个字母。
提示:
1 <= words.length <= 50
1 <= pattern.length = words[i].length <= 20
abc 就是111
aab 就是21
但是还要优化成aab->221 就可以成功了,明白不?
string[] s = new string[] { "badc", "abab", "dddd", "dede", "yyxx" };
string pattren = "baba";
FindAndReplacePattern(s, pattren);
Console.ReadKey();
}
public static IList<string> FindAndReplacePattern(string[] words, string pattern)
{
IList<string> res = new List<string>() { };
var dic = new Dictionary<char, int>();
var map = new Dictionary<char, int>();
foreach (var item in pattern)
{
if (dic.ContainsKey(item))
{
dic[item]++;
}
else
{
dic[item] = 1;
}
}
//pattern :abb,那么将12作为字符串的形式作为参考存入 db 里。
string db = "";
//foreach (var item in dic)
//{
// db += item.Value;
//}
for (int i = 0; i < pattern.Length; i++)
{
}
//将数组里的内容全部存到字典里
for (int i = 0; i < words.Length; i++)
{
for (int j = 0; j < words[i].Length; j++)
{
if (map.ContainsKey(words[i][j]))
{
map[words[i][j]]++;
}
else
{
map[words[i][j]]=1;
}
}
//在这个位置确定了第一个出炉的是否是1、2的value 和 db 进行对比,如果==,那么将这个数组里的值直接赋值给结果集合即可
string ccc = ""; //这里算出了abc , 那么ccc: 111,不等,那么map应该清空才行。
foreach (var item in map)
{
ccc += item.Value;
}
if (ccc == db)
{
res.Add(words[i]);
//相等也得清空啊
map = new Dictionary<char, int>();
}
else
{
//那么ccc: 111,不等,那么map应该清空才行。
map = new Dictionary<char, int>();
}
}
return res;
}