Skip to content

Commit 27bc6b3

Browse files
feat: word-break
1 parent b94aa56 commit 27bc6b3

File tree

1 file changed

+109
-0
lines changed

1 file changed

+109
-0
lines changed
Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
2+
//1. ๋ฐฑํŠธ๋ ˆํ‚น
3+
4+
/**
5+
* @param {string} s
6+
* @param {string[]} wordDict
7+
* @return {boolean}
8+
*/
9+
10+
function findIndexAfter(arr, startIndex, callback) {
11+
for (let i = startIndex + 1; i < arr.length; i++) {
12+
if (callback(arr[i], i, arr)) {
13+
return i;
14+
}
15+
}
16+
return -1; // ๋ชป ์ฐพ์œผ๋ฉด -1
17+
}
18+
19+
var wordBreak = function(s, wordDict) {
20+
let current = '';
21+
const dp = new Array(s.length).fill('');
22+
for(let i=0;i<s.length;i++){
23+
const isSegment = wordDict.find((e) => e == current+s[i] )
24+
if(isSegment) {
25+
dp[i] = current + s[i]
26+
current = ''
27+
}else{
28+
current += s[i]
29+
}
30+
31+
if(current.length == s.length && i == s.length-1){
32+
return dp[i] ? true:false
33+
}
34+
35+
// ๋ฌธ์ž์—ด์ด ์ €์žฅ์ด ๋˜์–ด์žˆ๋Š” ์œ„์น˜์— ๋‹ค์‹œ ๋Œ์•„๊ฐ„๋‹ค.
36+
// ๊ทธ ์œ„์น˜์— ๋นˆ ๋ฌธ์ž์—ด์„ ๋„ฃ์–ด์ค€ ํ›„ ๋‹ค์Œ index๋กœ ๋Œ์•„๊ฐ€๊ฒŒ๋” ํ•œ๋‹ค.
37+
if(i == s.length-1 && dp[s.length-1] == ''){
38+
i = dp.findLastIndex(e => e!=='')
39+
current = dp[i]
40+
dp[i] = '';
41+
}
42+
}
43+
return dp[s.length-1] ? true:false
44+
45+
};
46+
47+
48+
// ๊ฐ€์žฅ ์ดˆ๊ธฐ๊ฐ’์œผ๋กœ ๋“ค์–ด๊ฐ€๊ฒŒ ๋˜๋ฉด, ๋˜ ๊ฐ™์€์ผ์„ ์—ฌ๋Ÿฌ๋ฒˆ ๋ฐ˜๋ณตํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ, ๊ฐ€์žฅ ํฐ ๊ฐ’์œผ๋กœ ๋Œ์•„๊ฐ€์•ผํ•˜๋Š”๊ฒŒ ๋งž๋‹ค.
49+
// ๊ทธ๋Ÿฐ๋ฐ ๊ทธ๋งŒํผ, ๋” ์˜ค๋ž˜๊ฑธ๋ฆฌ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
50+
51+
/*์‹œ๊ฐ„๋ณต์žก๋„: O(nยฒ * m) (n: ๋ฌธ์ž์—ด ๊ธธ์ด, m: wordDict ๊ธธ์ด)
52+
๊ณต๊ฐ„๋ณต์žก๋„: O(n)
53+
*/
54+
55+
//2. ์‹คํŒจ๋‚œ ์ง€์ ์„ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ํ•˜๊ธฐ : ์‹œ๊ฐ„๋ฆฌ๋ฐ‹์ด ๋‚œ ์ด์œ ๋Š”, ์ด์ „์— ์‹คํŒจ๋‚œ ์ง€์ ์— ๋Œ€ํ•ด์„œ ๋‹ค์‹œ ๋Œ์•„๊ฐ„๋‹ค๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์—, word์˜ ์‹œ์ž‘๊ธฐ์ ์œผ๋กœ ์žก์œผ๋ฉด ๋ฌด์กฐ๊ฑด ์‹คํŒจ๊ฐ€ ๋‚˜๋Š” index๋ฅผ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ํ•œ๋‹ค.
56+
57+
/**
58+
* @param {string} s
59+
* @param {string[]} wordDict
60+
* @return {boolean}
61+
*/
62+
var wordBreak = function(s, wordDict) {
63+
const wordSet = new Set(wordDict); //์ค‘๋ณต์ด ๋˜์ง€ ์•Š๊ฒŒ ๋งŒ๋“ ๋‹ค.
64+
const failed = new Set(); //์‹คํŒจํ•œ ์ธ๋ฑ์Šค๋ฅผ ๊ธฐ๋กํ•œ๋‹ค.
65+
66+
function dfs(start){
67+
if(start === s.length) return true; // ์„ฑ๊ณต
68+
if(failed.has(start)) return false; //์—ฌ๊ธธ ๊ธฐ์ ์œผ๋กœ ํ•˜๋ฉด ์‹คํŒจํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๊ธฐ๋ก.
69+
70+
for(let end = start+1; end<=s.length; end++){
71+
const word = s.slice(start,end);
72+
if(wordSet.has(word) && dfs(end)){ // ์—ฌ๊ธฐ์„œ ์ž˜๋ž์„ ๋•Œ ๊ฐ€๋Šฅํ•œ์ง€.
73+
return true;
74+
}
75+
}
76+
failed.add(start);
77+
return false;
78+
}
79+
return dfs(0);
80+
};
81+
82+
/*
83+
์‹œ๊ฐ„๋ณต์žก๋„: O(n^2) + ๋ฉ”๋ชจ์ด์ œ์ด์…˜์œผ๋กœ ์ตœ์ ํ™”
84+
๊ณต๊ฐ„๋ณต์žก๋„ : O(n) : ์žฌ๊ท€์Šคํƒ, failed set
85+
*/
86+
87+
//3. dp๋ฅผ ํ™œ์šฉํ•˜์—ฌ, ์ด์ค‘ ํฌ๋ฌธ์œผ๋กœ j,i ์‚ฌ์ด์— ๊ฐ€๋Šฅํ•œ ๋ถ€๋ถ„์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.
88+
89+
var wordBreak = function(s, wordDict) {
90+
const wordSet = new Set(wordDict);
91+
const dp = new Array(s.length + 1).fill(false);
92+
dp[0] = true; // ๋นˆ ๋ฌธ์ž์—ด์€ ํ•ญ์ƒ ๊ฐ€๋Šฅ
93+
94+
for (let i = 1; i <= s.length; i++) {
95+
for (let j = 0; j < i; j++) {
96+
if (dp[j] && wordSet.has(s.slice(j, i))) {
97+
dp[i] = true;
98+
break; // ๋” ์ด์ƒ ๊ฒ€์‚ฌ ์•ˆ ํ•ด๋„ ๋จ
99+
}
100+
}
101+
}
102+
103+
return dp[s.length];
104+
};
105+
106+
/*
107+
์‹œ๊ฐ„๋ณต์žก๋„: O(n^2)
108+
๊ณต๊ฐ„๋ณต์žก๋„ : O(n)
109+
*/

0 commit comments

Comments
ย (0)