Youtube 코드 없는 프로그래밍 DP 플레이리스트 따라서,
LeetCode DP 중급 문제 풀이
DP 난이도가 조금 올라가니까,
Problem-SubProblem 나누는 것도 쉽지 않았다
문제 대부분 혼자서 해결하지 못했고,
강의 영상과 LeetCode Discuss 내용 참고해서 해결했다
코드 자체는 별거 없는데,
점화식을 만들고 풀이법을 생각하는 것이 미숙하면 상당히 어렵게 느껴지는 것 같다
/**
* @param {number[]} nums
* @return {number}
*/
const maxSubArray = (nums) => {
for (let idx = 1; idx < nums.length; idx++) {
nums[idx] = nums[idx - 1] < 0 ? nums[idx] : nums[idx] + nums[idx - 1];
}
return Math.max(...nums);
};
/**
* @param {number[]} nums
* @return {number}
*/
const maxProduct = (nums) => {
const first = nums[0];
let totMax = first;
let preMax = first;
let preMin = first;
for (let i = 1; i < nums.length; i++) {
const curNum = nums[i];
const curr = [preMax * curNum, preMin * curNum, curNum];
preMax = Math.max(...curr);
preMin = Math.min(...curr);
if (preMax > totMax) totMax = preMax;
}
return totMax;
};
/**
* @param {string} s
* @return {string}
*/
const longestPalindrome = (s) => {
const getPal = (left, right) => {
while (left >= 0 && right < s.length && s[left] === s[right]) {
left--;
right++;
}
return s.slice(left + 1, right);
};
let longest = "";
for (let i = 0; i < s.length; i++) {
const pal1 = getPal(i, i);
const pal2 = getPal(i, i + 1);
const pal = pal1.length < pal2.length ? pal2 : pal1;
longest = longest.length < pal.length ? pal : longest;
}
return longest;
};
/**
* @param {string} s
* @param {string[]} wordDict
* @return {boolean}
*/
const wordBreak = function (s, wordDict) {
const size = s.length;
const memo = Array(size + 1).fill(false);
memo[0] = true;
const wordSet = new Set(wordDict);
for (let start = 0; start < size; start++) {
if (!memo[start]) continue;
wordSet.forEach((word) => {
if (s.slice(start).indexOf(word) === 0) {
memo[start + word.length] = true;
}
});
}
return memo[size];
};