不同字符串长度的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#字谜?的主要内容,如果未能解决你的问题,请参考以下文章