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