asp.net下比较两个等长字符串是否含有完全相同字符(忽略字符顺序) |
本文标签:等长,字符串比较 例如:“北京欢迎你”和“欢迎你北京”,于是有了下列的测试,但是发现效率应该还有提升的空间,不知道有没有其他更好的办法 。 刚开始是这样想的,判断两个字符串中的字符是否含有完全相同的字符需要两个条件 1,两个字符串长度相同 2,两个字符串中的每个字符都在对方的串中 比如前面说的:“北京欢迎你”和“欢迎你北京”,于是有了下面的一段代码: 复制代码 代码如下: private static bool CompareStringByChar(string strA,string strB) { bool IsEqual = true; char[] arrA = strA.ToCharArray(); char[] arrB = strB.ToCharArray(); foreach (char chara in arrA) { if (!strB.Contains(chara)) { IsEqual = false; } } foreach (char charb in arrB) { if (!strA.Contains(charb)) { IsEqual = false; } } return IsEqual; } 测试通过,但是当两个字符串中有重复的字符呢,如:“4455”和“4555”,那么上面的程序就无能为力了,只能判断两个字符串都含有4和5,但是却无法判断两个字符的数量是否一样,无法满足要求,所以处理两个字符串的需求又变成这样: 1,两字符串中任意一个字符都在对方的串中 2,两字符串中任意一个字符的数量与对方串中相同字符的数量相等 3,两个字符串长度相等(由于2,可取消 。) 改造后的程序如下: 比较两个字符串是否含有完全相同的字符 复制代码 代码如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace StringCompare { class Program { static void Main(string[] args) { string a = "4555"; string b = "5544"; Console.WriteLine(CompareStringByChar(a,b)); Console.Read(); } //比较两个字符串是否含有完全相同的字符 private static bool CompareStringByChar(string strA,string strB) { bool IsEqual = true; char[] arrA = strA.ToCharArray(); char[] arrB = strB.ToCharArray(); foreach (char chara in arrA) { if (!strB.Contains(chara)) { IsEqual = false; } else { if(GetSameCharCount(chara,arrA)!=GetSameCharCount(chara,arrB)) { IsEqual = false; } } } foreach (char charb in arrB) { if (!strA.Contains(charb)) { IsEqual = false; } else { if (GetSameCharCount(charb, arrA) != GetSameCharCount(charb, arrB)) { IsEqual = false; } } } return IsEqual; } //获得某字符在字符串中的数量 private static int GetSameCharCount(char chara,char[] arrChar) { int count = 0; foreach(char a in arrChar) { if(chara==a) { count++; } } return count; } } } 感觉还有更好的办法,抛砖引玉,希望朋友们不吝赐教 。 上面的比较两个等长字符串是否含有完全相同字符(忽略字符顺序)有朋友说了更为简单的办法,中午实现了一下 。多谢 Paradox 。 需求是比较两个字符串中含有的字符是否完全相同,即“我和你”与“你和我”是含有相同字符的 。 这个实现的基本逻辑是这样的,将两个字符串分别放到List中,做简单的循环判断,如果A集合中的字符在B中出现,则同步删除A与B中的这个字符 。 至于有朋友说采用最大公共字符串的方法,LCS和LD算法的话,在矩阵中找的话个人以为不比这个省多少时间,有空了试试 。 复制代码 代码如下: [code] using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Collections; namespace StringCompare { class Program { static void Main(string[] args) { string strA = "中华人民共和国"; string strB = "共和国人民中华"; List<char> listA = strA.ToList(); List<char> listB = strB.ToList(); for (int i = 0; i < listA.Count;i++ ) { for (int j = 0; j < listB.Count;j++ ) { if (listA[i].ToString() == listB[j].ToString()) { listA.RemoveAt(i); listB.RemoveAt(j); i--; j--; break; } } } if (listA.Count == 0 && listB.Count == 0) { Console.WriteLine("相等"); } else { Console.WriteLine("不相等"); } Console.Read(); } } } [/code] 作者:LeonWeng 出处:http://cnblogs.com/wengyuli |