@@ -17,9 +17,9 @@ For A = "ABCD" B = "AABC", return false.
17
17
18
18
## 题解
19
19
20
- 题目意思是问B中的所有字符是否都在A中,而不是单个字符。比如B="AABC"包含两个「A」,而A="ABCD"只包含一个「A」,故返回false.
20
+ 题 [ Two Strings Are Anagrams | Data Structure and Algorithm ] ( http://algorithm.yuanbin.me/string/two_strings_are_anagrams.html ) 的变形题。 题目意思是问B中的所有字符是否都在A中,而不是单个字符。比如B="AABC"包含两个「A」,而A="ABCD"只包含一个「A」,故返回false. 做题时注意题意,必要时可向面试官确认。
21
21
22
- 既然不是类似strstr那样的匹配 ,直接使用两重循环就不太合适了。题目中另外给的条件则是A和B都是全大小单词,理解题意后容易想到的方案就是先遍历A和B统计各字符出现的频次 ,然后比较频次大小即可。嗯,祭出万能的哈希表。
22
+ 既然不是类似 strstr 那样的匹配 ,直接使用两重循环就不太合适了。题目中另外给的条件则是A和B都是全大写单词,理解题意后容易想到的方案就是先遍历 A 和 B 统计各字符出现的频次 ,然后比较频次大小即可。嗯,祭出万能的哈希表。
23
23
24
24
### C++
25
25
@@ -33,25 +33,18 @@ public:
33
33
* else return false
34
34
* /
35
35
bool compareStrings(string A, string B) {
36
- if (B.empty()) {
37
- return true;
38
- }
39
- if (A.empty()) {
36
+ if (A.size() < B.size()) {
40
37
return false;
41
38
}
42
39
43
40
const int AlphabetNum = 26;
44
- int freqA[AlphabetNum] = {0};
45
- int freqB[AlphabetNum] = {0};
46
- string::size_type ixA, ixB;
47
- for (ixA = 0; ixA != A.size(); ++ixA) {
48
- ++freqA[A[ixA] - 'A'];
49
- }
50
- for (ixB = 0 ; ixB != B.size(); ++ixB) {
51
- ++freqB[B[ixB] - 'A'];
41
+ int letterCount[AlphabetNum] = {0};
42
+ for (int i = 0; i != A.size(); ++i) {
43
+ ++letterCount[A[i] - 'A'];
52
44
}
53
- for (int i = 0; i != AlphabetNum; ++i) {
54
- if (freqA[i] - freqB[i] < 0) {
45
+ for (int i = 0 ; i != B.size(); ++i) {
46
+ --letterCount[B[i] - 'A'];
47
+ if (letterCount[B[i] - 'A'] < 0) {
55
48
return false;
56
49
}
57
50
}
@@ -63,48 +56,9 @@ public:
63
56
64
57
### 源码解析
65
58
66
- 使用数组` freqA ` 和` freqB ` 分别保存A和B中各字母出现的频次,随后遍历比较两数组,若A中相应的频次小于B时,返回false,否则遍历完后返回true.
67
-
68
- 最后一步比较` freqA ` 和` freqB ` 的频次时,其实是可以放到遍历B字符串的时候处理的。优化后的代码如下:
69
-
70
- ### C++
71
-
72
- ``` c++
73
- class Solution {
74
- public:
75
- /**
76
- * @param A: A string includes Upper Case letters
77
- * @param B: A string includes Upper Case letter
78
- * @return : if string A contains all of the characters in B return true
79
- * else return false
80
- * /
81
- bool compareStrings(string A, string B) {
82
- if (B.empty()) {
83
- return true;
84
- }
85
- if (A.empty()) {
86
- return false;
87
- }
88
-
89
- const int AlphabetNum = 26;
90
- int freqA[AlphabetNum] = {0};
91
- int freqB[AlphabetNum] = {0};
92
- string::size_type ixA, ixB;
93
- for (ixA = 0; ixA != A.size(); ++ixA) {
94
- ++freqA[A[ixA] - 'A'];
95
- }
96
- for (ixB = 0 ; ixB != B.size(); ++ixB) {
97
- ++freqB[B[ixB] - 'A'];
98
- if (freqA[B[ixB] - 'A'] - freqB[B[ixB] - 'A'] < 0) {
99
- return false;
100
- }
101
- }
102
-
103
- return true;
104
- }
105
- };
106
- ```
59
+ 1 . 异常处理,B 的长度大于 A 时必定返回` false ` , 包含了空串的特殊情况。
60
+ 2 . 使用额外的辅助空间,统计各字符的频次。
107
61
108
- ## Reference
62
+ ### 复杂度分析
109
63
110
- - [ Lintcode: Compare Strings - neverlandly - 博客园 ] ( http://www.cnblogs.com/EdwardLiu/p/4273817.html )
64
+ 遍历一次 A 字符串,遍历一次 B 字符串,时间复杂度最坏 $$ O(2n) $$ , 空间复杂度为 $$ O(26) $$ .
0 commit comments