Given two words word1 and word2, find the minimum number of steps required to convert word1 to word2. (each operation is counted as 1 step.)
You have the following 3 operations permitted on a word:
a) Insert a character
b) Delete a character
c) Replace a character
题目解析:
当a[i]和b[j]相等的时候,就判断a[i-1]和b[j-1]就行了。肯定取到最小值。如果不相等,就判断a[i-1]和b[j]、a[i-1]和b[j-1]、a[i]和b[j-1]三个,取最小的一个然后+1才是(i,j)的值!
代码过程中遇到两个问题,如何分配二维数组?如何释放二维数组?
先看代码,上面两个问题等会回答。
class Solution{
public:
int minDistance(string word1,string word2){
int len1 = word1.size();
int len2 = word2.size();
if(len1 == 0) //直接
return len2;
if(len2 == 0)
return len1;
int **a; //动态分配二维数组,其实通过解答,直接分配两个以为数组就行了,但是每次的以为数组的起始值是不一样的!
a = new int*[len1+1];
for(int i = 0;i <= len1;i++)
a[i] = new int[len2+1];
for(int i = 0;i <= len1;i++) //初始化
for(int j = 0;j <= len2;j++)
a[i][j] = -1;
for(int i = 0;i <= len1;i++) //将第0行和第0列进行初始化,每一行的初始值是不一样的
a[i][0] = i;
for(int j = 0;j <= len2;j++)
a[0][j] = j;
for(int i = 1;i <= len1;i++){ //按照行遍历。
for(int j = 1;j <= len2;j++){
if(word1[i-1] == word2[j-1])
a[i][j] = a[i-1][j-1];
else{
int min = a[i-1][j] < a[i-1][j-1] ? a[i-1][j] : a[i-1][j-1];
min = min < a[i][j-1] ? min : a[i][j-1];
a[i][j] = min + 1;
}
}
}
int temp = a[len1][len2];
for(int i = 0;i <= len1;i++){ //释放内存空间
delete []a[i];
a[i] = NULL;
}
delete []a;
a = NULL;
return temp;
}
};
下面回答上面的两个问题:
如何申请?
int i,j;
int **a;
a=new int *[m];
for(i=0; i<m; i++)
a[i]=new int [n];
如何释放?
for(int i = 0;i <= len1;i++){ //释放内存空间
delete []a[i];
a[i] = NULL;
}
delete []a;
a = NULL;
多种方法:
C语言:
//二维数组动态数组分配和释放
//数组指针的内存分配和释放
//方法一
char (*a)[N];//指向数组的指针
a = (char (*)[N])malloc(sizeof(char [N]) * m);
free(a);
//方法二
char **a;
int i;
a = (char **)malloc(sizeof(char *) * m);//分配指针数组
for(i=0; i<m; i++)
a[i] = (char *)malloc(sizeof(char) * n);//分配每个指针所指向的数组
for(i=0; i<m; i++)
free(a[i]);
free(a);
//方法三
char **a;
int i;
a = (char **)malloc(sizeof(char *) * m);//分配指针数组
a[0] = (char *)malloc(sizeof(char) * m * n);//一次性分配所有空间
for(i=1; i<m; i++)
a[i] = a[i-1] + n;
free(a[0]);
free(a);
//指针数组的内存分配和释放
//方法一
char* a[M];//指针的数组
int i;
for(i=0; i<M; i++)
a[i] = (char *)malloc(sizeof(char) * n);
for(i=0; i<M; i++)
free(a[i]);
//方法二
char* a[M];//指针的数组
int i;
a[0] = (char *)malloc(sizeof(char) * M * n);
for(i=1; i<M; i++)
a[i] = a[i-1] + n;
free(a[0]);
C++语言:
//二维数组动态数组分配和释放
//数组指针的内存分配和释放
//方法一
char (*a)[N];//指向数组的指针
a = new char[m][N];
delete[] a;
//方法二
char **a;
a = new char* [m];//分配指针数组
for(int i=0; i<m; i++)
a[i] = new char[n];//分配每个指针所指向的数组
for(i=0; i<m; i++)
delete[] a[i];
delete[] a;
//指针数组的内存分配和释放
//方法一
char **a;
a = new char* [m];
a[0] = new char[m * n];//一次性分配所有空间
for(int i=1; i<m; i++)
a[i] = a[i-1] + n;//分配每个指针所指向的数组
delete[] a[0];
delete[] a;
//方法二
char* a[M];//指针的数组
for(int i=0; i<M; i++)
a[i] = new char[n];
for(i=0; i<M; i++)
delete[] a[i];
//方法三
char* a[M];//指针的数组
a[0] = new char[M*n];
for(int i=1; i<M; i++)
a[i] = a[i-1] + n;
delete[] a[0];
注意:
new和delete要注意配对使用,即有多少个new就有多少个delete,这样才可以避免内存泄漏!
参考链接:http://bbs.csdn.net/topics/390337580
http://blog.163.com/likunlunnihao@126/blog/static/118277127200952285824688/