1
+ function isAnagram ( s : string , t : string ) : boolean {
2
+ /* 방법 1:
3
+ * 문자열을 순서대로 정렬 후 맞는지 비교한다.
4
+
5
+ * 복잡도: O(n log n)
6
+ */
7
+ const checkAnagramFromSort = ( ) : boolean => {
8
+ if ( s . length !== t . length ) {
9
+ return false ;
10
+ }
11
+
12
+ const sortedS : string [ ] = [ ...s ] . sort ( ) ;
13
+ const sortedT : string [ ] = [ ...t ] . sort ( ) ;
14
+
15
+ for ( let i = 0 ; i < s . length ; i ++ ) {
16
+ console . log ( sortedS [ i ] , sortedT [ i ] ) ;
17
+ if ( sortedS [ i ] !== sortedT [ i ] ) {
18
+ return false ;
19
+ }
20
+ }
21
+
22
+ return true ;
23
+ }
24
+
25
+ /* 방법 2: (Failed)
26
+ * Size 체크 후 Set객체에 s단어를 할당한 후 t에서 has메소드로 체크
27
+
28
+ * 복잡도 : O(n)
29
+ * 실패 이유 : Set 객체를 사용하여 중복 문자가 사라지기 때문에 정상적인 비교가 불가
30
+ */
31
+ const checkAnagramFromSetObject = ( ) : boolean => {
32
+ const sSet = new Set ( s ) ;
33
+ const tSet = new Set ( t ) ;
34
+
35
+ if ( s . length !== t . length ) {
36
+ return false ;
37
+ } else {
38
+ for ( let str of sSet ) {
39
+ if ( ! tSet . has ( str ) ) {
40
+ return false ;
41
+ }
42
+ }
43
+
44
+ return true ;
45
+ }
46
+ } ;
47
+
48
+ /* 방법3:
49
+ * culculateMap을 만들어 둠
50
+ * Record<string, number> 타입
51
+ * S, T의 길이가 일치한다는 가정 하에
52
+ * S는 알파벳마다 +1을 T는 -1을 계산
53
+ * 값이 0이 되는 순간 항상 삭제
54
+ * 전부 돌았을 때 culculateMap.size가 0인 경우 true
55
+ *
56
+ * 복잡도: O(n)
57
+ */
58
+ const checkAnagramFromCulculateMap = ( ) :boolean => {
59
+ if ( s . length !== t . length ) return false ;
60
+
61
+ const culculateMap = new Map < string , number > ( ) ;
62
+
63
+ for ( let i = 0 ; i < s . length ; i ++ ) {
64
+ const sWord = s [ i ] ;
65
+ const tWord = t [ i ] ;
66
+
67
+ const prevSValue = culculateMap . get ( sWord ) ?? 0 ;
68
+ const nextSValue = prevSValue + 1 ;
69
+ if ( nextSValue === 0 ) {
70
+ culculateMap . delete ( sWord )
71
+ } else {
72
+ culculateMap . set ( sWord , nextSValue ) ;
73
+ }
74
+
75
+ const prevTValue = culculateMap . get ( tWord ) ?? 0 ;
76
+ const nextTValue = prevTValue - 1 ;
77
+ if ( nextTValue === 0 ) {
78
+ culculateMap . delete ( tWord )
79
+ } else {
80
+ culculateMap . set ( tWord , nextTValue ) ;
81
+ }
82
+ } ;
83
+
84
+
85
+ return culculateMap . size === 0 ;
86
+
87
+ } ;
88
+
89
+ // return checkAnagramFromSort();
90
+ // return checkAnagramFromSetObject();
91
+ return checkAnagramFromCulculateMap ( ) ;
92
+ } ;
0 commit comments