당신이 정말로 원하는 것은 Levenshtein 거리 같은 것입니다 (정확히는 그런 것은 아닙니다). 여기에 첫 번째 커팅이 있습니다. 그것은 무엇을
바깥 쪽 루프가 먼저 예산의 0으로 걷기 때문에 정확한 일치 만 허용됩니다.
성공하지 못하면 예산 한도로 1 회의 재배치 만 포함 된 모든 일치를 찾습니다.
성공하지 못하면 2의 예산으로 걷습니다. 이 일치하기
, 그것은 정수 의 각 요소가 교환되어 얼마나 말하고 델타의 어레이를 유지한다. 성공을 거둘 때마다 somwhow가 델타 배열을 인쇄합니다. 그리고 그것은 그 매치를 얻기 위해 어떤 스왑이 수행되었는지 기록한 것입니다.
void walk(char* a, char* b, int* delta, int budget, int& nSuccess){
delta[0] = 0;
if (budget < 0) return;
if (a[0] == '\0' && b[0] == '\0'){ // end of both strings
nSuccess++;
// print out the deltas
return;
}
if (a[0] == '\0') return; // excess chars in b
if (b[0] == '\0') return; // excess chars in a
if (a[0] == b[0]){ // first chars are equal, move to next
walk(a+1, b+1, delta+1, budget, nSuccess);
return;
}
for (int i = 1; a[i] != '\0'; i++){
delta[0] = i;
swap(a[0], a[i]);
if (a[0] == b[0]){
walk(a+1, b+1, delta+1, budget-1, nSuccess);
}
swap(a[0], a[i]);
delta[0] = 0;
}
}
void top(char* a, char* b){
int nSuccess = 0;
int delta[512];
for (int budget = 0; nSuccess==0; budget++){
walk(a, b, budget, delta, nSuccess);
}
}
알고리즘의 성능은 N에서 지수 함수이며, N은 문자열을 일치시키는 데 필요한 재배치의 최소 수입니다. 따라서 각 문자열의 문자 수가 각각 동일해야합니다 ( )는 것을 확인한 후 다시 정렬해야합니다.
질문은 명확하지 않지만 "거리 편집"또는 "거리 측정"과 같은 것에 대해 생각하고있을 수도 있습니다. –
정확히 무엇을 다시 찾으 시나요? 또한 문자열에 반복되는 문자가있을 수 있습니까? 그리고 두 번째 문자열에서 'c'가 첫 번째 문자열의 'c'인지 어떻게 알 수 있습니까? –