You are given a positive integer n.
A binary string x is valid if all
of x of length 2 contain at least one "1".
Return all valid strings with length n, in any order.
Example 1:
Input: n = 3
Output: ["010","011","101","110","111"]
Explanation:
The valid strings of length 3 are: "010", "011", "101", "110", and "111".
Example 2:
Input: n = 1
Output: ["0","1"]
Explanation:
The valid strings of length 1 are: "0" and "1".
출처 : https://leetcode.com/problems/generate-binary-strings-without-adjacent-zeros/
풀이
function validStrings(n: number): string[] {
let gen=[];
let result=[];
function dfs(i,prev){
if(i==n){
result.push(gen.join(''));
return;
}
if(prev!='' && prev=='0'){
gen.push('1');
dfs(i+1,'1');
gen.pop();
}else{
gen.push('0');
dfs(i+1,'0');
gen.pop();
gen.push('1');
dfs(i+1,'1');
gen.pop();
}
}
dfs(0,'');
return result;
};
주어진 숫자 n에 따라 특정 규칙을 따르는 문자열 배열을 생성.
"0"과 "1"로 이루어진 문자열을 생성하는데, "0"이 연속으로 나오지 않도록 하는 함수
예제
입력: n = 3
이 경우 함수는 길이가 3인 문자열 중에서 연속된 "0"이 없는 모든 가능한 문자열을 생성
함수 동작 과정
- 초기 상태:
- gen = []
- result = []
- dfs(0, '') 호출:
- i = 0, prev = ''
- prev가 빈 문자열이므로 "0"과 "1" 모두 추가 가능.
- "0" 추가:
- gen = ['0']
- dfs(1, '0') 호출.
- dfs(1, '0'):
- i = 1, prev = '0'
- 이전 문자가 "0"이므로 "1"만 추가 가능.
- "1" 추가:
- gen = ['0', '1']
- dfs(2, '1') 호출.
- dfs(2, '1'):
- i = 2, prev = '1'
- "0"과 "1" 모두 추가 가능.
- "0" 추가:
- gen = ['0', '1', '0']
- dfs(3, '0') 호출.
- dfs(3, '0'):
- i = 3, prev = '0'
- i가 n과 같으므로, gen을 문자열로 변환하여 result에 추가.
- result = ['010']
- "0" 제거:
- gen = ['0', '1']
- "1" 추가:
- gen = ['0', '1', '1']
- dfs(3, '1') 호출.
- dfs(3, '1'):
- i = 3, prev = '1'
- i가 n과 같으므로, gen을 문자열로 변환하여 result에 추가.
- result = ['010', '011']
- "1" 제거:
- gen = ['0', '1']
- "1" 제거:
- gen = ['0']
- "0" 제거:
- gen = []
gen.push('0');
dfs(i+1,'0');
gen.pop();
함수 끝
gen.push('1');
dfs(i+1,'1');
gen.pop();
함수 시작
- "1" 추가:
- gen = ['1']
- dfs(1, '1') 호출.
- dfs(1, '1'):
- i = 1, prev = '1'
- "0"과 "1" 모두 추가 가능.
- "0" 추가:
- gen = ['1', '0']
- dfs(2, '0') 호출.
- dfs(2, '0'):
- i = 2, prev = '0'
- "1"만 추가 가능.
- "1" 추가:
- gen = ['1', '0', '1']
- dfs(3, '1') 호출.
- dfs(3, '1'):
- i = 3, prev = '1'
- i가 n과 같으므로, gen을 문자열로 변환하여 result에 추가.
- result = ['010', '011', '101']
- "1" 제거:
- gen = ['1', '0']
- "0" 제거:
- gen = ['1']
- "1" 추가:
- gen = ['1', '1']
- dfs(2, '1') 호출.
- dfs(2, '1'):
- i = 2, prev = '1'
- "0"과 "1" 모두 추가 가능.
- "0" 추가:
- gen = ['1', '1', '0']
- dfs(3, '0') 호출.
- dfs(3, '0'):
- i = 3, prev = '0'
- i가 n과 같으므로, gen을 문자열로 변환하여 result에 추가.
- result = ['010', '011', '101', '110']
- "0" 제거:
- gen = ['1', '1']
- "1" 추가:
- gen = ['1', '1', '1']
- dfs(3, '1') 호출.
- dfs(3, '1'):
- i = 3, prev = '1'
- i가 n과 같으므로, gen을 문자열로 변환하여 result에 추가.
- result = ['010', '011', '101', '110', '111']
- "1" 제거:
- gen = ['1', '1']
- "1" 제거:
- gen = ['1']
- "1" 제거:
- gen = []
최종 결과
함수는 연속된 "0"이 없는 길이 3의 문자열을 모두 생성하여 반환
['010', '011', '101', '110', '111']'LeetCode' 카테고리의 다른 글
| 3192. Minimum Operations to Make Binary Array Elements Equal to One II / TypeScript (0) | 2024.07.26 |
|---|---|
| 646. Maximum Length of Pair Chain / TypeScript (4) | 2024.07.24 |
| 539. Minimum Time Difference / TypeScript (0) | 2024.07.21 |
| 2618. Check if Object Instance of Class / TypeScript (1) | 2024.07.20 |
| 581. Shortest Unsorted Continuous Subarray / TypeScript (1) | 2024.07.19 |