【问题标题】:C# anagrams of different string length?不同字符串长度的C#字谜?
【发布时间】: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 检查会成功

标签: c# string linq lambda anagram


【解决方案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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-03
    • 1970-01-01
    相关资源
    最近更新 更多