Leetcode139) Word Break

image

BFS Solution

  • add
class Solution {
    public boolean wordBreak(String s, List<String> wordDict) {
        Queue<String> q = new LinkedList<>();
        List<String> visited = new ArrayList<>();

        q.add(s);
        // q is not empty
        while(!q.isEmpty()){
            String cur= q.poll();

            //base case
            if(cur.equals("")){
                return true;
            }

            if(visited.contains(cur)){
                continue;
            }
            visited.add(cur);


            for(int i =0;i<wordDict.size();i++){
                String dictItem = wordDict.get(i);
                if(cur.length()>=dictItem.length() && cur.substring(0,dictItem.length()).equals(dictItem)){
                    q.add(cur.substring(dictItem.length()));
                }
            }

        }

        return false;


    }
}

# DP Solution

![Presentation1](https://user-images.githubusercontent.com/37058233/129793230-1202513b-7d97-4255-b097-c59befeb8073.gif)

![image](https://user-images.githubusercontent.com/37058233/129793407-4d6192d3-e51a-4795-b4c3-7a51f0901116.png)
![image](https://user-images.githubusercontent.com/37058233/129793428-3c586826-06d7-4127-9102-ce8abfdd845b.png)

```java
public boolean wordBreak(String s, List<String> wordList) {
    boolean[] dp = new boolean[s.length() + 1];
    Set<String> set = new HashSet<>();
    for (String word : wordList) {
        set.add(word);
    }
    dp[0] = true;
    for (int i = 1; i <= s.length(); i++) {
        for (int j = 0; j < i; j++) {
            if (dp[j] && set.contains(s.substring(j, i))) {
                dp[i] = true;
                break;
            }
        }
    }
    return dp[s.length()];
}

Brute Force

  • list.contains(apple) => 이걸로 리스트 안에 apple이 있는지 없는지 간단하게 알 수 있다.
  • stack 사용해서 previous true인 인덱스들을 집어 넣어줬다.
import java.util.*;
class Solution {
    public boolean wordBreak(String s, List<String> wordDict) {
        int[] important = new int[s.length()];
        important[0]=1;
        Stack<Integer> prev= new Stack<>();
        for (int i=0;i<s.length();i++){
            important[0]=1;
            if(important[i]==1){
                for(int j=i+1;j<s.length()+1;j++){
                    if(wordDict.contains(s.substring(i,j))){
                        if(j==s.length()){
                            return true;
                        }else{
                            if(important[j]!=-1){
                                prev.push(i);
                                important[j]=1;    
                                break;                           
                            }else{
                                continue;
                            }         
                        }                         
                    }else if(j==s.length()){
                        important[i]=-1;
                        if(prev.empty()){return false;}
                        i=prev.pop()-1;
                        break;
                    }
                }
            }      
        }
        return false;
    }
}

잘못 생각한 부분

  • lc 완전 처음 시작할 때라서 완전 기초적인 부분이넹.. 신기
  1. 단순한 건데 인지하지 못해서 틀렸다. 여기서 내가 루프를 다시 돌고 싶어서 for문 안에서, i=3으로 다시 넣어주면, 루프 끝나면서 1이 더해져서 4부터 시작한다. 3으로 돌아가서 루프 돌고 싶다면, i=2를 해줘야지 다음 루프에 i=3이 된다.
boolean a=true;
for(int i =0;i<10;i++){
	if(a){
		i=3;
		a=false;
	}
}
  1. a : index 0 에 다시 돌아왔을 때 false라고 생각했는데, 그게 아니다. 첫 단어부터 단추가 잘못끼였을 수 있으니까.. index 0 에 돌아왔고, important 어레이의 f들이 너무 많아져서 어떤 단어를 추가하려고 해도 못하고 그냥 for루프를 나갔을 때 false가 된다. 끝에 닿았는데 stack에 아무 숫자도 없어서 돌아갈 곳이 없으면 또 false가된다.
import java.util.*;
class Solution {
    public boolean wordBreak(String s, List<String> wordDict) {
        //일케 초기화 하면, 어레이 다 0으로 일단 초기화 됨. boolean 어레이일 경우, 다 false로 초기화.
        int[] important = new int[s.length()];
        important[0]=1;
        Stack<Integer> prev= new Stack<>();
        for (int i=0;i<s.length();i++){
            // System.out.println(Arrays.toString(important));
            important[0]=1;
            /*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
            if(important[0]==-1){
                return false;} 
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*/

            if(important[i]==1){
                for(int j=i+1;j<s.length()+1;j++){
                    if(wordDict.contains(s.substring(i,j))){
                        // System.out.println(s.substring(i,j));
                        if(j==s.length()){
                            return true;
                        }else{
                            if(important[j]!=-1){
                                prev.push(i);
                                important[j]=1;    
                                break;                           
                            }else{
                                continue;
                            }         
                        }                         
                        //만약 찾는 단어도 없는데 length도 맥시멈이라면?
                    }else if(j==s.length()){
                        //j가 마지막 인덱스에 닿았음에도, wordDict에 단어가 없다?(있으면 진즉에 브레이크로 나가야함) 너 false!
                        important[i]=-1;
                        //prev를 스택으로 안해서 문제인거같은데? ㅇㅇ 그래서 문제.
                        //그리고 더이상 팝할게 없으면 그럼 끝나는거...
                        if(prev.empty()){return false;}
                        i=prev.pop()-1;
                        break;
                    }
                }
            }      
        } 
        return false;
    }
}

© 2018. All rights reserved.

Powered by Hydejack v8.5.2