Post

leetcode(리트코드)139-Word Break

leetcode(리트코드)139-Word Break

leetcode 139 - Word Break 문제입니다.

1. 문제

https://leetcode.com/problems/word-break/


2. Input , Output


3. 분류 및 난이도

Medium 난이도 문제입니다.
leetcode Top 100 Liked 문제입니다.


4. 문제 해석

  • s의 문자열과 wordDict이라는 문자열이 들어옵니다.
  • wordDict의 문자들을 사용 및 중복사용하여, s문자열을 만들 수 있으면 True, 만들 수 없으면 False를 리턴합니다.
  • wordDict을 중복사용할 수 있어서 고민을 많이 했는데 c++은 map를 이용하고, python은 ‘in’ 구문을 사용하여 구별할 수 있었습니다.
  • 시작 인덱스만 조회하여, 끝까지 닿을 수 있으면 True, 닿을 수 없으면 False를 리턴합니다.

5. code

c++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class Solution {
public:
    bool wordBreak(string s, vector<string>& wordDict) {
        bool* v = new bool[s.size()+1];
        memset(v,false,sizeof(bool) *(s.size()+1) );
        v[0] = true;
        unordered_map<string,bool> map;
        for(size_t i =0;i<wordDict.size();++i)
        {
            map[wordDict[i]] = true;
        }
        for(int i =1;i<s.size()+1;++i)
        {
            for(int j =0;j<i;++j)
            {
                string temp(s,j,i-j);
                if(v[j] == true)
                {
                    auto it = map.find(temp);
                    if(it!=map.end())
                    {
                        v[i]=true;
                        break;
                    }
                }
            }
        }
        return v[s.size()];
    }
};

python

1
2
3
4
5
6
7
8
9
10
11
12
13
class Solution:
    def wordBreak(self, s: str, wordDict: List[str]) -> bool:
        v = [0] * (len(s)+1)
        v[0]=1
        for i in range(1,len(s)+1):
            for j in range(i) : 
                if v[j] ==1 and s[j:i] in wordDict:
                    v[i] = 1
                    break
        if v[len(s)] == 1:
            return True
        return False
            

6. 결과 및 후기, 개선점

코드에 대한 설명이 필요하신 분은 댓글을 달아주세요.!!

c++ 45% python 83%

c++ 0ms 100% code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
//dp
class Solution
{
 public:
 bool wordBreak(string s, vector<string>& wordDict) {
        if (wordDict.size() == 0) return false;
        
        unordered_set<string> d(wordDict.begin(), wordDict.end());
           
		 // dp[i] is true only if a valid word or sequence of words ends at i
        vector<bool> dp(s.size() + 1, false);
        dp[0] = true;
        
        for (int i = 1; i <= s.size(); ++i) {
            for (int j = i - 1; j >= 0; --j) {
                // check only if a valid sequence of words (or a word) ends at j
                if (dp[j]) {
                    const string sub = s.substr(j, i - j);
                    if (d.count(sub)) {
                        // Ending at i is a valid word
                        dp[i] = true; 
						// Others j values might be false
						// We stop here since there is one valid sequence ending here
                        break; 
                    }
                }
            }
        }
        return dp[s.size()];
    }
};

로직은 동일한 것 같은데 시간차이가 많이 납니다.

This post is licensed under CC BY 4.0 by the author.