2014-10-10 6 views
0

backtracking 알고리즘으로 wordbreakII 문제 을 해결했습니다. 나는 정면에서 처리하려고하면역 추적 알고리즘이 반드시 뒤에서 시작해야합니까?

public static List<String> wordBreak(String s, Set<String> dict) { 
    List<String> words = new ArrayList<String>(); 
    int len = s.length(); 
    for (int i = len -1; i >= 0; i--) { 
     String last = s.substring(i, len); //get the last word and process the rest 
     if (dict.contains(last)) { 
      if (i == 0) { 
       words.add(last); 
      } else { 
       String remain = s.substring(0, i); 
       List<String> remainSet = wordBreak(remain, dict); 
       if (remainSet != null) { 
        for (String item : remainSet) { 
         words.add(item + " " + last); 
        } 
       } 
      } 
     } 
    } 
    return words; 
} 

하면, 결과는 동일해야합니다 : 다음은 코드입니다.

public static List<String> wordBreakFront(String s, Set<String> dict) { 
    List<String> words = new ArrayList<String>(); 

    int len = s.length(); 
    for (int i = 1; i <= len; i++) { 
     String front = s.substring(0, i); 
     if (dict.contains(front)) { 
      if (i == len) { 
       words.add(front); 
      } else { 
       //get the front word and process the rest. 
       String remain = s.substring(i, len); 
       List<String> remainSet = wordBreak(remain, dict); 
       if (remainSet != null) { 
        for (String item : remainSet) { 
         words.add(front + " " + item); 
        } 
       } 
      } 
     } 
    } 
    return words; 
} 

앞 추적 기능도 작동합니다 (올바른 출력을 생성 할 수 있음). 그러나 효율이 낮다는 것은 시간 제한 테스트에서 실패한 것입니다. 나중에이 경우에 실패

// 마지막으로 실행 입력 : "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab", [ "A", "AA", "AAA", "AAAA", "AAAAA", "AAAAAA", "AAAAAAA" "aaaaaaaa", "aaaaaaaaa", "aaaaaaaaaa"]

그래서 왜 뒤에서 시작하면 차이가 있는지 이해할 수 없습니까?

감사합니다.

+0

이것은 가능한 단어 **를 찾는 것으로 만 해결 된 것처럼 보입니다. 그 예는 모든 가능한 문장을 찾는다 고 말합니다 **. 그것이 "고양이와 개"또는 "고양이 모래 개"를 찾는 것을 보여주는 것과 같습니다. 누군가가 역 추적을하는 것이 중요하다고 여기는 것은 그것이 실제 문제를 해결하지 않았기 때문입니다. – Carter

+2

'backtracking' 알고리즘은 어떤 것의 뒷 부분에서 시작하는 알고리즘이 아니며, (개념적) 검색 공간을 통과하고 막 다른 골목 (또는 예상되는 많은 솔루션 또는 유사한 조건의 한 솔루션)이 마주 칠 때 알고리즘입니다. '백 트랙 '경로를 따라 탐색 공간을 통해 구타를 당할 때까지 (개념적) 교차점에서 또 다른 (개념적) 전진 경로를 취합니다. 미로에서 벗어나는 길을 찾는 데 시각 장애가있는 알고리즘을 적용한다고 상상해보십시오. 막 다른 길로 되돌아 가면 마지막 교차점까지 '역 추적'하고 다른 방향으로 이동하십시오. –

+0

@Carter, 내 해결책은 가능한 모든 문장을 찾습니다. 첫 번째 해결책이 제출되고 승인됩니다. 나중에 하나는 실제로 동일하지만 하나의 경우에는 실패합니다. "단어"는 가능한 모든 문장을 포함하는 Arraylist입니다. – Jimmy

답변

2

두 경우 모두 최악의 경우 지수 적 시간 복잡성을 갖습니다. 첫 번째 단어는 성공했고 두 번째 단어는 실패했습니다 (입력 단어와 사전의 모든 단어를 뒤집 으면 첫 번째 단어가 너무 길게 작동합니다).

+0

네, 그냥 찾았습니다 ... 나는 또한 역전 된 문자열을 시도했습니다. 감사. 그래서 알고리즘 백 트래킹은 단지 이름 일뿐입니다. 뒤에서 시작해야한다는 것을 의미하지는 않습니까? 그렇습니다. – Jimmy

+0

@ 지미 어디서나 시작할 수 있습니다. – kraskevich

+0

감사합니다. – Jimmy