Skip to content

[Leetcode] 131. Palindrome Partitioning ​

Problem ​

문제 링크

μͺΌκ°œμ„œ λ‚˜μ˜¬ 수 μžˆλŠ” νŒ°λ¦°λ“œλ‘¬μ˜ 경우의 수λ₯Ό κ΅¬ν•˜λŠ” 문제

Solution ​

js
input: 'aaabbc'
output: [
  ['a', 'a', 'a', 'b', 'b', 'c'],
  ['a', 'a', 'a', 'bb', 'c'],
  ['a', 'aa', 'b', 'b', 'c'],
  ['a', 'aa', 'bb', 'c'],
  ['aa', 'a', 'b', 'b', 'c'],
  ['aa', 'a', 'bb', 'c'],
  ['aaa', 'b', 'b', 'c'],
  ['aaa', 'bb', 'c'],
]

μœ„ ν…ŒμŠ€νŠΈμΌ€μ΄μŠ€λ₯Ό μž…λ ₯ν•˜κ³  λŒλ Έμ„λ•Œ, κ°€μž₯ μž‘μ€ μ‚¬μ΄μ¦ˆμ˜ νŒ°λ¦°λ“œλ‘¬λΆ€ν„° ꡬ해지고, 였λ₯Έμͺ½μ˜ 값을 μž‘μ€ λ‹¨μœ„λΌκ³ ν–ˆμ„λ•Œ 점점 λ‹¨μœ„κ°€ μ»€μ§€λŠ” μˆœμ„œλ‘œ 배치되고 μžˆλŠ”κ²ƒμ„ μ•Œ μˆ˜μžˆλ‹€. 이 νŒ¨ν„΄μ„ μ΄μš©ν•΄μ„œ DFSλ₯Ό κ΅¬ν˜„ν•˜λ©΄ λœλ‹€.

μž‘μ€ λ‹¨μœ„λ‘œ μͺΌκ°œλ©΄μ„œ κΉŠμ€ 뎁슀둜 μ§„μž…ν•œλ‹€. λͺ¨λ“  μš”μ†Œλ₯Ό κ²€μ‚¬ν–ˆλ‹€λ©΄ νŒ°λ¦°λ“œλ‘¬μ˜ 값을 μ €μž₯ν•œλ‹€. μ΄λ•Œ μˆœμ„œμƒ νŠΉμ • λ¬Έμžμ—΄μ„ κ²€μ‚¬ν• λ•Œ νŒ°λ¦°λ“œλ‘¬μ΄ μ•„λ‹ˆλΌλ©΄ κΉŠμ€ 뎁슀둜 λ“€μ–΄κ°€μ§€ λͺ»ν•˜λ„둝 쑰건처리λ₯Ό ν•œλ‹€. μ΅œμ’… λŽμŠ€μ—μ„œ νŒ°λ¦°λ“œλ‘¬μœΌλ‘œ κ²€μ‚¬λœ κ°’(λ°°μ—΄)은 μ΄μ „λŽμŠ€μ—μ„œλ„ νŒ°λ¦°λ“œλ‘¬μ΄κΈ° λ•Œλ¬Έμ— μ΄μ „λŽμŠ€μ—μ„œ 검사할 문자의 길이λ₯Ό λŠ˜λ €κ°€λ©΄μ„œ κ²€μ‚¬ν•˜λ„λ‘ ν•œλ‹€.

JS Code ​

js
/**
 * @param {string} s
 * @return {string[][]}
 */
var partition = function (s) {
  const isPalindrome = str =>
    Array.from(str)
      .reverse()
      .every((c, i) => c === str[i])

  let answer = []

  function dfs(left = 0, arr = []) {
    if (left === s.length) answer.push([...arr])

    for (let right = left + 1; right <= s.length; right++) {
      const substr = s.substring(left, right)

      if (!isPalindrome(substr)) continue

      arr.push(substr)
      dfs(right, arr)
      arr.pop()
    }
  }
  dfs()
  return answer
}