题解 | #牛群编号变更#
牛群编号变更
https://www.nowcoder.com/practice/9295f0f796b34793832710d5c939a619
知识点:
动态规划/编辑距离
分析:
首先题目中给出两个字符串,有两种操作可以进行:
1.在编号中插入一个字符
2.删除编号中的一个字符
使得a字符串变为字符串b,求变更的最小次数
状态表示:
- 状态表示:word1[1~i]变为word2[1~j]的操作次数的最小次数
- 状态属性:min,求最小次数
状态计算
- 计算f[i][j],依次考虑两种操作方式:
1) 删除操作:把word1[i]删掉之后word1[1~i]和word2[1~j]匹配,所以之前要先做到word1[1~(i-1)]和word2[1~j]匹配, f[i-1][j] + 1
2) 插入操作:插入之后word1[i]与word2[j]完全匹配,所以插入的就是word2[j] ,那填之前word1[1~i]和word2[1~(j-1)]匹配,f[i][j-1] + 1
3) 如果word1 i == word2 j的话,不用修改,那么取最小值min(f[i][j], f[i-1][j-1])
关于初始化:
知识点:
动态规划/编辑距离
分析:
首先题目中给出两个字符串,有两种操作可以进行:
1.在编号中插入一个字符
2.删除编号中的一个字符
使得a字符串变为字符串b,求变更的最小次数
状态表示:
- 状态表示:word1[1~i]变为word2[1~j]的操作次数的最小次数
- 状态属性:min,求最小次数
状态计算
- 计算f[i][j],依次考虑两种操作方式:
1) 删除操作:把word1[i]删掉之后word1[1~i]和word2[1~j]匹配,所以之前要先做到word1[1~(i-1)]和word2[1~j]匹配, f[i-1][j] + 1
2) 插入操作:插入之后word1[i]与word2[j]完全匹配,所以插入的就是word2[j] ,那填之前word1[1~i]和word2[1~(j-1)]匹配,f[i][j-1] + 1
3) 如果word1 i == word2 j的话,不用修改,那么取最小值min(f[i][j], f[i-1][j-1])
关于初始化:
- f[0][i]如果word1初始长度就是0,那么只能用插入操作让它变成word2
- f[i][0]同样地,如果word2的长度是0,那么word1只能用删除操作让它变成word2
编程语言:
C/C++/Go/Python
完整代码:
c++:
int f[110][110];
int minDistance(string word1, string word2) {
int n = word1.size();
int m = word2.size();
for(int i =0;i<=n;i++) f[i][0] = i;
for(int i =0;i<=m;i++) f[0][i] = i;
for(int i = 1;i<=n;i++){
for(int j = 1;j<=m;j++){
f[i][j] = min(f[i][j - 1],f[i-1][j]) + 1;
if(word1[i-1] == word2[j-1]) f[i][j] = min(f[i][j],f[i-1][j-1]);
}
}
return f[n][m];
}
C:
int f[510][510];
int minDistance(char * word1, char * word2){
int n = strlen(word1);
int m = strlen(word2);
for(int i = 0;i<=n;i++) f[i][0] = i;
for(int i = 0;i<=m;i++) f[0][i] = i;
for(int i = 1;i<=n;i++){
for(int j = 1;j<=m;j++){
f[i][j] = min(f[i][j-1],f[i-1][j]) + 1;
if(word1[i - 1] == word2[j-1])
f[i][j] = min(f[i][j],f[i-1][j-1]);
}
}
return f[n][m];
}
int min(int x,int y){
if(x > y) return y;
else return x;
}
Go:
func minDistance(word1 string, word2 string) int {
n := len(word1)
m := len(word2)
var f = [510][510]int {}
for i:=0;i<=m;i++ {
f[0][i] = i
}
for i:=0;i<=n;i++ {
f[i][0] = i
}
for i:=1;i<=n;i++ {
for j:=1;j<=m;j++ {
f[i][j] = Min(f[i-1][j],f[i][j-1]) + 1
if word1[i - 1] == word2[j - 1] {
f[i][j] = Min(f[i][j],f[i-1][j-1])
}
}
}
return f[n][m]
}
func Min(x int,y int) int{
if x < y {
return x
} else {
return y
}
}
Python3:
def minDistance(self, word1: str, word2: str) -> int:
n = len(word1)
m = len(word2)
f = [[0]*510 for i in range(510)]
for i in range(0,n + 1):
f[i][0] = i
for i in range(0,m + 1):
f[0][i] = i
for i in range(1,n+1):
for j in range(1,m+1):
f[i][j] = min(f[i - 1][j],f[i][j - 1]) + 1
if word1[i - 1] == word2[j - 1]:
f[i][j] = min(f[i][j],f[i - 1][j - 1])
else:
f[i][j] = min(f[i][j],f[i - 1][j - 1] + 1)
return f[n][m]
编程语言:
C/C++/Go/Python
完整代码:
c++:
int f[110][110];
int minDistance(string word1, string word2) {
int n = word1.size();
int m = word2.size();
for(int i =0;i<=n;i++) f[i][0] = i;
for(int i =0;i<=m;i++) f[0][i] = i;
for(int i = 1;i<=n;i++){
for(int j = 1;j<=m;j++){
f[i][j] = min(f[i][j - 1],f[i-1][j]) + 1;
if(word1[i-1] == word2[j-1]) f[i][j] = min(f[i][j],f[i-1][j-1]);
}
}
return f[n][m];
}
C:
int f[510][510];
int minDistance(char * word1, char * word2){
int n = strlen(word1);
int m = strlen(word2);
for(int i = 0;i<=n;i++) f[i][0] = i;
for(int i = 0;i<=m;i++) f[0][i] = i;
for(int i = 1;i<=n;i++){
for(int j = 1;j<=m;j++){
f[i][j] = min(f[i][j-1],f[i-1][j]) + 1;
if(word1[i - 1] == word2[j-1])
f[i][j] = min(f[i][j],f[i-1][j-1]);
}
}
return f[n][m];
}
int min(int x,int y){
if(x > y) return y;
else return x;
}
Go:
func minDistance(word1 string, word2 string) int {
n := len(word1)
m := len(word2)
var f = [510][510]int {}
for i:=0;i<=m;i++ {
f[0][i] = i
}
for i:=0;i<=n;i++ {
f[i][0] = i
}
for i:=1;i<=n;i++ {
for j:=1;j<=m;j++ {
f[i][j] = Min(f[i-1][j],f[i][j-1]) + 1
if word1[i - 1] == word2[j - 1] {
f[i][j] = Min(f[i][j],f[i-1][j-1])
}
}
}
return f[n][m]
}
func Min(x int,y int) int{
if x < y {
return x
} else {
return y
}
}
Python3:
def minDistance(self, word1: str, word2: str) -> int:
n = len(word1)
m = len(word2)
f = [[0]*510 for i in range(510)]
for i in range(0,n + 1):
f[i][0] = i
for i in range(0,m + 1):
f[0][i] = i
for i in range(1,n+1):
for j in range(1,m+1):
f[i][j] = min(f[i - 1][j],f[i][j - 1]) + 1
if word1[i - 1] == word2[j - 1]:
f[i][j] = min(f[i][j],f[i - 1][j - 1])
else:
f[i][j] = min(f[i][j],f[i - 1][j - 1] + 1)
return f[n][m]

查看28道真题和解析