不同字符串长度的C#字谜?

Posted

技术标签:

【中文标题】不同字符串长度的C#字谜?【英文标题】:C# anagrams of different string length? 【发布时间】:2014-01-19 08:09:32 【问题描述】:
public static bool IsAnagramOf(this string word1, string word2)

    return word1.OrderBy(x => x).SequenceEqual(word2.OrderBy(x => x));

我目前正在从一个包含所有英文单词的大型 xml 文件中提取所有内容。然后我将每个单词与给定的字符串进行比较,看看它是否是一个字谜。然后我存储每个正确的单词并返回它们。

不过……

我想这样做,所以字谜不必具有相等的字符串长度。

例如:“Hello”包含“Hello”、“Hell”、“He”等...

有没有办法在代码中相对较小?

谢谢!

编辑:所以包括子字谜以及等长的字谜。

【问题讨论】:

查看String.IndexOf方法。 但是“你好”和“他”不是字谜,对吧? 所以你并不真正想要字谜,而只是单词中包含字母的单词。使用.Contains.Intersection 字谜和子字谜,如果你愿意的话? @BartoszKP - 好点......我认为这可能还不够 - “帮助”不能重新排列成“地狱”,但直接 Contains/Intersect 检查会成功 【参考方案1】:

也许你的方法应该叫ContainsTheSameSetOfLetters

public static bool ContainsTheSameSetOfLetters(this string word1, string word2)

    var chars = new HashSet<char>(word1);
    return word2.All(x => chars.Contains(x));

如果您关心特定字母的使用次数,您可以使用以下方法:

public static bool ContainsTheSameSetOfLetters(string word1, string word2)

    var chars = word1.GroupBy(x => x).ToDictionary(g => g.Key, g => g.Count());
    return word2.GroupBy(x => x).All(g => chars.ContainsKey(g.Key) && chars[g.Key] >= g.Count());

【讨论】:

虽然没有说明存在正确数量的重复字母 - Hello 和 Helooooo 会返回 true 如上所说,hello 可以返回孔例如。 我用另一种方法更新了我的答案,该方法也检查两个字符串中存在 char 的次数。 第二个答案似乎返回了一切。 什么意思全部归还【参考方案2】:

尝试创建一个扩展方法来检查序列是否以另一个序列开头,而不是使用 SequenceEqual。

【讨论】:

以上是关于不同字符串长度的C#字谜?的主要内容,如果未能解决你的问题,请参考以下文章

分开不同的字谜

如何处理字谜搜索期间字符串排列的时间复杂度?

字谜排序版本与计数字符版本

检查需要删除多少个字符才能在 Python 中生成字谜

无法理解这个字谜问题解决方案背后的逻辑[关闭]

如何检查两个字符串是不是是字谜?