1: class Program
2: {
3: static void Main(string[] args)
4: {
5: string s = File.ReadAllText(@"e:\test.txt");
6: Program p = new Program();
7: bool r=p.IsAnagrams_1(s,s);
8: r = p.IsAnagrams_2(s,s);
9: }
10:
11: /// <summary>
12: /// Check if the two strings have identical counts for each unique char.
13: /// 首先使用框架自帶函數OrderByDescending,稍後會做比較
14: /// 由於使用了背後機制爲快速排序,因此複雜度爲O(nLogn)
15: /// </summary>
16: public bool IsAnagrams_1(string s1, string s2)
17: {
18: if (string.IsNullOrEmpty(s1) || string.IsNullOrEmpty(s1))
19: {
20: throw new ArgumentException("not accept null or empty string");
21: }
22: else if (s1.Length != s1.Length)
23: {
24: return false;
25: }
26:
27: //OrderByDescending背後用的是快速排序法
28: char[] charArray1 = s1.OrderByDescending(a => a).ToArray();
29: char[] charArray2 = s2.OrderByDescending(a => a).ToArray();
30:
31: for (int i = 0; i < charArray1.Length; i++)
32: {
33: if (charArray1[i] != charArray2[i])
34: {
35: return false;
36: }
37: }
38: return true;
39: }
40:
41: /// <summary>
42: /// 該方法依舊假設輸入爲ASCII串
43: /// 複雜度爲O(n)
44: /// </summary>
45: public bool IsAnagrams_2(string s1, string s2)
46: {
47: if (string.IsNullOrEmpty(s1) || string.IsNullOrEmpty(s1))
48: {
49: throw new ArgumentException("not accept null or empty string");
50: }
51: else if (s1.Length != s1.Length)
52: {
53: return false;
54: }
55:
56: int[] flags = new int[256];
57: for (int i = 0; i < s1.Length; i++)
58: {
59: char c = s1[i];
60: if (c > 255)
61: {
62: throw new ArgumentException("not accept non-ASCII string");
63: }
64:
65: flags[c]++;
66: }
67:
68: for (int i = 0; i < s2.Length; i++)
69: {
70: char c = s2[i];
71: if (c > 255)
72: {
73: throw new ArgumentException("not accept non-ASCII string");
74: }
75:
76: if (flags[c] == 0)
77: {
78: return false;
79: }
80: flags[c]--;
81: }
82:
83: return true;
84: }
85:
86: /****
87: 由於複雜度不在一個等級上,因此在處理超長字符串的時候,2比1要快不少,百萬級別長度字串實驗驗證以下
88: 可是2由於對輸入要求限制較高,因此影響了其應用,實踐中,若是是超長未知格式字符串,不妨先嚐試用法2試探
89: 若是ASCII佔大多數,不妨分而治之
90: ****/
91: }