String Distance and Transform Process 상세 정보
Insert pos,value Delete pos Replace pos,value
샘플 입력:
abcac
bcd
aaa
aabaaaa
출력 예제:
3
1 Delete 1
2 Replace 3,d
3 Delete 4
4
1 Insert 1,a
2 Insert 2,a
3 Insert 3,b
4 Insert 7,a
방법: 동적 계획
1. dp[i][j], i는str1의 i위, j는str2의,str1[i-1],str[j-1]가 일치하는 후 몇 걸음이 필요한지 표시
2. dp[x][y]=min(dp[x-1][y]+1, dp[x][y-1]+1, dp[x-1][y-1]+(str1[i-1]과str2[j-1]가 같은지 안 같은지는 조작(고칠 필요가 없고, 다르면 고칠 필요가 있다)).
3. 경계 조건:str1 길이가 0일 때 dp[0][str2.size()]는str2가 필요합니다.size()보(str2.size()회 증가);
4. 반복 순서: asc(순서)
참고:
1.dp[str1.size()][str2.size()];//오류 설명: dp[len1][len2];
2. 첨삭 수정.고치는 것이 증가하는 것보다 낫고, 고치는 것이 삭제하는 것보다 낫다.
불친절한 코드는 다음과 같습니다.
#include
#include
#include <string>
#include
using namespace std;
#define xx 81
int min(int x, int y, int z) {
x = x < y ? x : y;
return x < z ? x : z;
}
int main() {
string str1, str2;
int dp[xx][xx];
bool flag[xx][xx];
int len1, len2;
while (cin >> str1 >> str2) {
len1 = str1.size(), len2 = str2.size();
//cout << len1 << " " << len2 << endl;
// flag
for (int i = 0; i < len1; i++)
for (int j = 0; j < len2; j++)
flag[i][j] = str1[i] == str2[j] ? 0 : 1;
//
for (int i = 0; i < xx; ++i)dp[i][0] = dp[0][i] = i;
// dp
for (int i = 1; i <= len1; i++) {
for (int j = 1; j <= len2; j++) {
dp[i][j] = min(dp[i - 1][j] + 1, dp[i][j - 1] + 1, dp[i - 1][j - 1] + flag[i-1][j-1]);//
}
}
//
cout << dp[len1][len2] << "
";
for (int k = 1; k <= dp[str1.size()][str2.size()];) {
int t;
if (len1 == 0 && len2 != 0)t = 1;
else if (len1 != 0 && len2 == 0)t = 2;
else if (len1 != 0 && len2 != 0) {
/*
if (dp[len1][len2 - 1] == min(dp[len1 - 1][len2], dp[len1][len2 - 1], dp[len1 - 1][len2 - 1]))t = 1;//
else if (dp[len1 - 1][len2] == min(dp[len1 - 1][len2], dp[len1][len2 - 1], dp[len1 - 1][len2 - 1]))t = 2;//
else if (dp[len1 - 1][len2 - 1] == min(dp[len1 - 1][len2], dp[len1][len2 - 1], dp[len1 - 1][len2 - 1]))t = (dp[len1 - 1][len2 - 1] == dp[len1][len2] ? 0 : 3);//
*/
// ,
if (dp[len1 - 1][len2 - 1] == min(dp[len1 - 1][len2], dp[len1][len2 - 1], dp[len1 - 1][len2 - 1]))t = (dp[len1 - 1][len2 - 1] == dp[len1][len2] ? 0 : 3);//
else if (dp[len1][len2 - 1] == min(dp[len1 - 1][len2], dp[len1][len2 - 1], dp[len1 - 1][len2 - 1]))t = 1;//
else if (dp[len1 - 1][len2] == min(dp[len1 - 1][len2], dp[len1][len2 - 1], dp[len1 - 1][len2 - 1]))t = 2;//
}
//cout << k << " " << dp[str1.size()][str2.size()] << endl;
//cout << len1 << len2 << endl;
switch (t) {
case 0:len1--, len2--;break;//
case 1:printf("%d Insert %d,%c
", k++, len1 + 1, str2[--len2]);break;//
case 2:printf("%d Delete %d
", k++, len1--);break;//
case 3:printf("%d Replace %d,%c
", k++, len1--, str2[--len2]);break;//
default:break;
}
}
//cout << " over " << endl;
}
return 0;
}
개인적으로 제 문제풀이만 보시고 코드는 제가 쓰세요~ 제가 머리가 커요.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.