문자열 차이 비교 알고리즘 분석
두 문자열 a, b 를 지정 합 니 다.작성 자 는 a 와 b 의 같은 부분 을 빈 칸 으로 대체 하고 다른 부분 은 보류 합 니 다.
예 를 들 어 a = "평생 한 가지 일 만 한다", b = "태 어 날 때 부터 한 가지 일 만 한다".처 리 를 거 친 후에 문자열 a 는 '평생' 으로 바 뀌 었 고 문자열 b 는 '태어나면서' 로 바 뀌 었 다.
위 와 같이 처리 한 후에 우 리 는 빈 칸 이 아 닌 하 이 라이트 만 있 으 면 두 텍스트 의 다른 점 을 한눈 에 알 수 있다.
위의 문 제 는 비교적 직접적인 사 고 는 두 문자열 을 문자 의 집합 으로 나 누 어 두 문자 의 집합 을 구 하 는 것 이다.그리고 교 집합 에 있 는 문 자 를 빈 칸 으로 바 꿉 니 다.그러나 문 제 를 완벽 하 게 해결 할 수 는 없다.예 를 들 어 문자열 a 에 '하나' 가 두 번 나 타 났 고 b 에 한 번 나 타 났 다.프로그램 은 a 중의 두 개의 '하나' 를 모두 같은 부분 으로 착각 할 수 있다.그리하여 a = "생" 을 얻다.
위의 문제 가 발생 한 이 유 는 한 글자 가 문자열 에서 반복 되 기 쉬 우 므 로 문자열 을 길이 가 2 인 하위 문자열 로 분해 하 는 것 을 고려 해 보 자.예 를 들 어 a 는:
, , , , , ,
로 분해 된다.b 분 해 는: , , , , ,
.두 문자열 모두 , , ,
가 있 음 을 알 수 있다.같은 부분 을 빼 면 정확 한 결 과 를 얻 을 수 있다.그러나 글 이 길 면 길이 가 2 인 하위 문자열 도 중복 된다.이것 은 우리 가 가장 긴 하위 꼬치 부터 중복 항목 을 찾 아야 한 다 는 것 을 알려 준다.
해결 방향: a, b 의 짧 은 문자열 을 a 로 가정 하고 그 길 이 를 $l 로 가정 합 니 다.a $, 즉:
a *b
와 정비례 할 것 이다.알고리즘 의 관건 적 인 부분 은 다음 과 같 습 니 다 (자바 언어 설명). 알고리즘 의 입 구 는 첫 번 째 getDiff 방법 입 니 다.
// , ,
public String[] getDiff(String a, String b) {
String[] result = null;
//
if (a.length() < b.length()) {
result = getDiff(a, b, 0, a.length());
} else {
result = getDiff(b, a, 0, b.length());
result = new String[]{result[1],result[0]};
}
return result;
}
// a b
private String[] getDiff(String a, String b, int start, int end){
String[] result = new String[]{a, b};
int len = result[0].length();
while (len > 0) {
for (int i = start; i < end - len + 1; i++) {
String sub = result[0].substring(i, i + len);
int idx = -1;
if ((idx = result[1].indexOf(sub)) != -1) {
System.out.println(sub);
result[0] = setEmpty(result[0], i, i + len);
result[1] = setEmpty(result[1], idx, idx + len);
if (i > 0) {
//
result = getDiff(result[0], result[1], 0, i);
}
if (i + len < end) {
//
result = getDiff(result[0], result[1], i + len, end);
}
len=0;// while
break;
}
}
len = len / 2;
}
return result;
}
// s
public String setEmpty(String s, int start, int end) {
char[] array = s.toCharArray();
for (int i = start; i < end; i++) {
array[i] = ' ';
}
return new String(array);
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.