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"]
그래서 왜 뒤에서 시작하면 차이가 있는지 이해할 수 없습니까?
감사합니다.
이것은 가능한 단어 **를 찾는 것으로 만 해결 된 것처럼 보입니다. 그 예는 모든 가능한 문장을 찾는다 고 말합니다 **. 그것이 "고양이와 개"또는 "고양이 모래 개"를 찾는 것을 보여주는 것과 같습니다. 누군가가 역 추적을하는 것이 중요하다고 여기는 것은 그것이 실제 문제를 해결하지 않았기 때문입니다. – Carter
'backtracking' 알고리즘은 어떤 것의 뒷 부분에서 시작하는 알고리즘이 아니며, (개념적) 검색 공간을 통과하고 막 다른 골목 (또는 예상되는 많은 솔루션 또는 유사한 조건의 한 솔루션)이 마주 칠 때 알고리즘입니다. '백 트랙 '경로를 따라 탐색 공간을 통해 구타를 당할 때까지 (개념적) 교차점에서 또 다른 (개념적) 전진 경로를 취합니다. 미로에서 벗어나는 길을 찾는 데 시각 장애가있는 알고리즘을 적용한다고 상상해보십시오. 막 다른 길로 되돌아 가면 마지막 교차점까지 '역 추적'하고 다른 방향으로 이동하십시오. –
@Carter, 내 해결책은 가능한 모든 문장을 찾습니다. 첫 번째 해결책이 제출되고 승인됩니다. 나중에 하나는 실제로 동일하지만 하나의 경우에는 실패합니다. "단어"는 가능한 모든 문장을 포함하는 Arraylist입니다. – Jimmy