Word Break

유승선 ·2025년 5월 7일
0

LeetCode

목록 보기
126/126

문자열 s 가 주어졌을 때 wordDict 안에 있는 문자열로 쪼개는 것이 가능한지 물어보는 문제다.
처음에 브루트포스 방식으로 접근하게 되면 2중 for loop 을 사용해서 모든 문자열을 쪼개고 wordDict 랑 비교하는 방식을 생각해봤다. 이때 Map 을 필수로 사용이 될 것이니 아마 O(n^2) 의 시간으로도 풀 수 있었을 것이다.

그런데 DP 방식으로 생각해보면 더 좋은 방향으로 풀 수 있다. 결국에 wordDict 안에 매칭된 문자가 있다면 그 구간을 기준으로 다음 문자를 비교하는 방식이다. Subproblem 을 생각해봐야 하는 DP 문제에서 좋은 접근 같았다. 그렇기 때문에 첫 인덱스를 기준으로 wordDict 안에 있는 문자와 비교를 했고 매칭되는 구간이 있다면 dp 에 기록을 했다.

DP 배열에 기록하는 방식은 내가 마지막으로 매칭 된 문자가 어디인지 확인하기 위함이고 이런 구간 별로 subproblem 을 만들어야 하는 문제에서 유용하게 사용이 가능할거같다. wordDict 의 길이를 m 이라고 했을 때 시간 복잡도는 O(n*m) 으로 예상된다.

class Solution {
public:
    bool wordBreak(string s, vector<string>& wordDict) {
        int n = s.length();
        vector<bool> dp(n,false); 

        for(int i = 0; i < n; i++){
            for(string& ss : wordDict){
                if(i < ss.length() - 1) continue; 

                if(i == ss.length() -1 || dp[i - ss.length()]){
                    if(s.substr(i - ss.length() + 1, ss.length()) == ss){
                        dp[i] = true; 
                        break; 
                    }
                }
            }
        }

        return dp[n-1]; 
    }
};
profile
성장하는 사람

0개의 댓글

Powered by GraphCDN, the GraphQL CDN