728x90
가위바위보 재귀 문제의 변형. 동일한 문자열을 가지지도 않음.
주어진 문자열의 순서를 바꿀 때 어느정도까지의 경우의 수가 나오는지를 체크하는 것.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
/**
 * Given a single input string, write a function that produces all possible anagrams
 * of a string and outputs them as an array. At first, don't worry about
 * repeated strings.  What time complexity is your solution?
 *
 * Extra credit: Deduplicate your return array without using uniq().
 */
 
/**
 * example usage:
 * var anagrams = allAnagrams('abc');
 * console.log(anagrams); // [ 'abc', 'acb', 'bac', 'bca', 'cab', 'cba' ]
 */
 
var allAnagrams = function (string) {
  // string = apps
  //debugger;
  let strArr = string.split(''); //= [a,p,p,s]
  let res = {};
  let check = []; // = 0: a , 1:p , 2: p, 3: s / [f,f,f,f]
  //문자열내에서 해당 문자는 반복적으로 못쓰지만 apps 처럼 자체적으로 문자가 2번 이상 쓰인 경우에 대해서 고려해야함
  //자릿수는 중복될수 없기때문에 각 문자들을 인덱스 즉 자리로 구분하기
  for (let j = 0; j < strArr.length; j++) {
    check[j] = false;
  }
  makeAnagrams = (str, count) => {
    if (count === strArr.length) {
      //res.indexOf(str) === -1 이걸로 유니크한 값을 추려내려니 시간복잡도가 문제
      //결국 객체로 값을 별도로 주는 방법을 활용해야 하는 건가?
      if (!res[str]) {
        res[str] = true;
      }
    } else {
      for (let i = 0; i < strArr.length; i++) {
        // i = 0 = a
        if (check[i] === false) {
          check[i] = true// check = [t,f,f,f]
          makeAnagrams(str + strArr[i], count + 1);
          check[i] = false;
          str.slice(0, count);
        }
      }
    }
  };
  makeAnagrams(''0);
  return Object.keys(res);
};
 
//allAnagrams(`debitcard`);
 
cs

 

728x90

+ Recent posts